diff --git a/DEPS b/DEPS index db922860..73137bb7 100644 --- a/DEPS +++ b/DEPS
@@ -253,7 +253,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '2f41c6acfaac9bde393a02497918f4d9c6bc2109', + 'skia_revision': 'b61366b54f7bc3105ea1fd4122ca38af3cdf573c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -261,7 +261,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '15b558c19c9fb01e35bf8449f9f816dce00bd83f', + 'angle_revision': '19fd3bc5e74bfd6b0acd9af0445b8d46c9ba3cba', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -296,7 +296,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': 'e9690d3fde973560634218261171a3ccb7deefae', + 'nacl_revision': '9cdce6d77285c5ef9486cc9e4bd594a8588ce51c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -328,7 +328,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'f72cffbaf93d603d5c80aacbcdb7c989fc482600', + 'devtools_frontend_revision': '2af14943bbfe0a3d67ae357cf664a374e44486de', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -368,7 +368,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'd2a5d9c966001ff999a3fe51207bf365b2b4c25c', + 'dawn_revision': '74bd0d6136bdedcdd593988cfd20c7d9e710c250', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -704,7 +704,7 @@ Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248', 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '45ff4c5d75b9182d81d8a1bea92005acd2178e14', + 'url': Var('chromium_git') + '/website.git' + '@' + '2e203922c2ce00e482285868720a34ab0eaff613', }, 'src/ios/third_party/earl_grey2/src': { @@ -1111,7 +1111,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'fb8c9b32f202aeac5354def9b79d13145edb6eae', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '70cad7ed2d9f6747035c409f3c5ae2236f6464e2', 'condition': 'checkout_chromeos', }, @@ -1131,7 +1131,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1c22c511d02b4c4e02173297bcb8f2df3d3b4f66', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c0af61c8dd0fee6a483aacbf64a57d46ba80355e', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1514,7 +1514,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a930f3799c34bedb97a76b2292ac02b3bc053ccb', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '3a7d7533cecebf657e35406980bf1afb5fcd23b2', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1592,7 +1592,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/android/aemu/release/linux-amd64', - 'version': 'lRBrKgBHOD2T7NodVsRZ7Z8Cnzz9Aq4GGCbol5DTmD8C' + 'version': 'AIgTYYgmdPs_av1pbLnt22Gxu-76Czug5UIdTco3LvIC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1633,7 +1633,7 @@ 'packages': [ { 'package': 'chromium/third_party/robolectric', - 'version': 'FihBToFLI9o7fW09ZtQ_5YruQy6sDWMo1Pv0g97eAxEC', + 'version': 'WZ96VJuhBM63xzHb-_E72Tf46M9yIbfia6basI1YG4EC', }, ], 'condition': 'checkout_android', @@ -1735,7 +1735,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '008969e4d83211e112f83143bd7932f30e4ef549', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1dfb9f4db6c1b1c4ab1d99dc41d46c2c57637eb9', + Var('webrtc_git') + '/src.git' + '@' + '66557e1af3f95a70753e782224d13a6186ed0d2e', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1805,7 +1805,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@aebad417fdf44197f8c1292870e68ddc51841288', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ff371f589f6cf0a6722a0af47e85c3936dd71e06', 'condition': 'checkout_src_internal', }, @@ -1835,7 +1835,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': '78-uxKoYHcoiZ5pEfREXEyZuC8-HS0axlcIYB0vCBLoC', + 'version': '20x02lxECwfe99DGxwLSx_VOZ_srBETWNlG7a5B6RW8C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2792,7 +2792,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations', - 'version': 'version:2@2.10.0.cr0', + 'version': 'version:2@2.9.0.cr0', }, ], 'condition': 'checkout_android', @@ -3331,7 +3331,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm', - 'version': 'version:2@9.0.cr0', + 'version': 'version:2@9.2.cr1', }, ], 'condition': 'checkout_android', @@ -3342,7 +3342,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis', - 'version': 'version:2@9.0.cr0', + 'version': 'version:2@9.2.cr1', }, ], 'condition': 'checkout_android', @@ -3353,7 +3353,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons', - 'version': 'version:2@9.0.cr0', + 'version': 'version:2@9.2.cr1', }, ], 'condition': 'checkout_android', @@ -3364,7 +3364,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree', - 'version': 'version:2@9.0.cr0', + 'version': 'version:2@9.2.cr1', }, ], 'condition': 'checkout_android', @@ -3375,7 +3375,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_util', - 'version': 'version:2@9.0.cr0', + 'version': 'version:2@9.2.cr1', }, ], 'condition': 'checkout_android', @@ -3397,7 +3397,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_annotations', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3408,7 +3408,18 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_junit', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/org_robolectric_nativeruntime': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/org_robolectric_nativeruntime', + 'version': 'version:2@4.7.3.cr0', }, ], 'condition': 'checkout_android', @@ -3419,7 +3430,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_pluginapi', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3430,7 +3441,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3441,7 +3452,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_resources', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3452,7 +3463,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_robolectric', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3463,7 +3474,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_sandbox', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3474,7 +3485,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadowapi', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3485,7 +3496,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_framework', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3496,7 +3507,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_multidex', - 'version': 'version:2@4.6.1.cr1', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3507,7 +3518,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3518,7 +3529,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_utils', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android', @@ -3529,7 +3540,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_utils_reflector', - 'version': 'version:2@4.6.1.cr0', + 'version': 'version:2@4.7.3.cr1', }, ], 'condition': 'checkout_android',
diff --git a/WATCHLISTS b/WATCHLISTS index 1e7ced8..b87b2f3 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -741,8 +741,8 @@ '|ui/webui/resources/cr_components/chromeos/bluetooth' }, 'chromeos_cellular': { - 'filepath': 'chromeos/dbus/hermes/|'\ - 'chromeos/services/cellular_setup/|'\ + 'filepath': 'ash/services/cellular_setup/|'\ + 'chromeos/dbus/hermes/|'\ 'ui/webui/resources/cr_components/chromeos/cellular_setup/', }, 'chromeos_geolocation': {
diff --git a/ash/app_list/app_list_bubble_presenter.cc b/ash/app_list/app_list_bubble_presenter.cc index fcdbdda..3a1f4fb 100644 --- a/ash/app_list/app_list_bubble_presenter.cc +++ b/ash/app_list/app_list_bubble_presenter.cc
@@ -409,6 +409,13 @@ // Presses outside the bubble could be activating a shelf item. Record the // app list state prior to dismissal. controller_->RecordAppListState(); + + // The press outside the bubble might spawn a menu. If the bubble is active at + // the end of the hide animation, an activation change event will cause the + // menu to close. Deactivate now so menus stay open. https://crbug.com/1299088 + if (bubble_widget_->IsActive()) { + bubble_widget_->Deactivate(); + } Dismiss(); }
diff --git a/ash/app_list/app_list_bubble_presenter_unittest.cc b/ash/app_list/app_list_bubble_presenter_unittest.cc index f41f3a9..25577ee2 100644 --- a/ash/app_list/app_list_bubble_presenter_unittest.cc +++ b/ash/app_list/app_list_bubble_presenter_unittest.cc
@@ -16,6 +16,7 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/test/app_list_test_api.h" #include "ash/public/cpp/test/assistant_test_api.h" +#include "ash/root_window_controller.h" #include "ash/shelf/home_button.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_navigation_widget.h" @@ -772,5 +773,35 @@ EXPECT_TRUE(IsNear(bubble_view_top_right, GetShelfBounds().origin())); } +// Regression test for https://crbug.com/1299088 +TEST_F(AppListBubblePresenterTest, ContextMenuStaysOpenAfterDismissAppList) { + AppListBubblePresenter* presenter = GetBubblePresenter(); + presenter->Show(GetPrimaryDisplay().id()); + + // Enable animations. + ui::ScopedAnimationDurationScaleMode duration( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + + // Spawn a context menu by right-clicking outside the bubble's bounds. + views::Widget* bubble_widget = presenter->bubble_widget_for_test(); + gfx::Point outside_bubble = + bubble_widget->GetWindowBoundsInScreen().top_right() + + gfx::Vector2d(10, 0); + auto* generator = GetEventGenerator(); + generator->MoveMouseTo(outside_bubble); + generator->ClickRightButton(); + + auto* rwc = RootWindowController::ForWindow(bubble_widget->GetNativeWindow()); + ASSERT_TRUE(rwc->IsContextMenuShown()); + + // Wait for bubble to animate closed. + LayerAnimationStoppedWaiter().Wait( + presenter->bubble_view_for_test()->layer()); + ASSERT_FALSE(presenter->IsShowing()); + + // Context menu is still open. + EXPECT_TRUE(rwc->IsContextMenuShown()); +} + } // namespace } // namespace ash
diff --git a/ash/app_list/views/app_list_toast_view.cc b/ash/app_list/views/app_list_toast_view.cc index 760a6c2..ee81141 100644 --- a/ash/app_list/views/app_list_toast_view.cc +++ b/ash/app_list/views/app_list_toast_view.cc
@@ -28,10 +28,8 @@ namespace { constexpr int kCornerRadius = 16; -constexpr gfx::Insets kInteriorMarginClamshell(8, 8, 8, 20); -constexpr gfx::Insets kInteriorMarginTablet(8, 8, 8, 16); +constexpr gfx::Insets kInteriorMargin(8, 8, 8, 16); constexpr gfx::Insets kTitleContainerMargin(0, 16, 0, 24); -constexpr gfx::Insets kIconMargins(0, 8); constexpr int kToastHeight = 32; constexpr int kToastMaximumWidth = 640; @@ -155,7 +153,7 @@ AppListToastView::AppListToastView(const std::u16string title) { layout_manager_ = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, kInteriorMarginClamshell)); + views::BoxLayout::Orientation::kHorizontal, kInteriorMargin)); layout_manager_->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kCenter); @@ -177,8 +175,6 @@ void AppListToastView::StyleForTabletMode() { style_for_tablet_mode_ = true; - UpdateInteriorMargins(kInteriorMarginTablet); - SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); layer()->SetBackgroundBlur(ColorProvider::kBackgroundBlurSigma); @@ -329,7 +325,6 @@ 0); icon_->SetVerticalAlignment(views::ImageView::Alignment::kCenter); icon_->SetHorizontalAlignment(views::ImageView::Alignment::kCenter); - icon_->SetProperty(views::kMarginsKey, kIconMargins); } } // namespace ash
diff --git a/ash/app_list/views/continue_section_view.cc b/ash/app_list/views/continue_section_view.cc index d9a8801..52ae5a5d 100644 --- a/ash/app_list/views/continue_section_view.cc +++ b/ash/app_list/views/continue_section_view.cc
@@ -60,7 +60,7 @@ constexpr size_t kPrivacyIconSizeTablet = 48; // Privacy toast interior margin -constexpr gfx::Insets kPrivacyToastInteriorMargin(12, 12, 12, 16); +constexpr gfx::Insets kPrivacyToastInteriorMarginClamshell(12, 12, 12, 16); // Delay before marking the privacy notice as swhon. const base::TimeDelta kPrivacyNoticeShownDelay = base::Seconds(6); @@ -389,7 +389,8 @@ views::kFlexBehaviorKey, views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToMinimum, views::MaximumFlexSizeRule::kScaleToMaximum)); - privacy_toast_->UpdateInteriorMargins(kPrivacyToastInteriorMargin); + if (!tablet_mode_) + privacy_toast_->UpdateInteriorMargins(kPrivacyToastInteriorMarginClamshell); } bool ContinueSectionView::FirePrivacyNoticeShownTimerForTest() {
diff --git a/ash/capture_mode/capture_mode_camera_unittests.cc b/ash/capture_mode/capture_mode_camera_unittests.cc index 1907cdc..efe0120 100644 --- a/ash/capture_mode/capture_mode_camera_unittests.cc +++ b/ash/capture_mode/capture_mode_camera_unittests.cc
@@ -1002,10 +1002,11 @@ saved_video_file.DirName()); } -// Tests that there is no crash if moving the mouse to be on the top of the -// camera preview after capture type switching. Selected window should not be -// changed in this process either. -TEST_F(CaptureModeCameraTest, HoveringMouseOverCameraPreview) { +// Tests multiple scenarios to trigger selected window updates at located +// position. Camera preview's native window should be added to the ignore +// windows and no crash should happen in these cases. +TEST_F(CaptureModeCameraTest, + UpdateSelectedWindowAtPositionWithCameraPreviewIgnored) { auto* controller = StartCaptureSession(CaptureModeSource::kWindow, CaptureModeType::kVideo); AddDefaultCamera(); @@ -1024,12 +1025,42 @@ // candidates of the selected window. So moving the mouse to be on top of the // camera preview should not cause any crash or selected window changes. controller->SetType(CaptureModeType::kVideo); - event_generator->MoveMouseTo(camera_controller->camera_preview_widget() - ->GetWindowBoundsInScreen() - .CenterPoint()); - EXPECT_EQ(window(), controller->capture_mode_session()->GetSelectedWindow()); + const auto* camera_preview_widget = + camera_controller->camera_preview_widget(); + const auto* capture_mode_session = controller->capture_mode_session(); + event_generator->MoveMouseToCenterOf( + camera_preview_widget->GetNativeWindow()); + EXPECT_EQ(window(), capture_mode_session->GetSelectedWindow()); + EXPECT_TRUE(window()->IsVisible()); + EXPECT_TRUE(camera_preview_widget->IsVisible()); - controller->Stop(); + // Hide `window_` with camera preview on should not cause any crash and + // selected window should be updated to nullptr. + window()->Hide(); + EXPECT_FALSE(window()->IsVisible()); + EXPECT_FALSE(camera_preview_widget->IsVisible()); + EXPECT_FALSE(capture_mode_session->GetSelectedWindow()); + + // Reshow `window_` without hovering over it should not set the selected + // window. Camera preview should still be hidden as its parent hasn't been set + // to `window_` yet. + const auto* preview_native_window = camera_preview_widget->GetNativeWindow(); + window()->Show(); + EXPECT_TRUE(window()->IsVisible()); + EXPECT_FALSE(camera_preview_widget->IsVisible()); + EXPECT_FALSE(capture_mode_session->GetSelectedWindow()); + EXPECT_EQ(preview_native_window->parent(), + preview_native_window->GetRootWindow()->GetChildById( + kShellWindowId_UnparentedContainer)); + + // Hovering over `window_` should set it to the selected window, camera + // preview widget should be reparented to it as well. And the camera preview + // widget should be visible now. + event_generator->MoveMouseToCenterOf(window()); + EXPECT_EQ(preview_native_window->parent(), + capture_mode_session->GetSelectedWindow()); + EXPECT_TRUE(camera_preview_widget->IsVisible()); + EXPECT_EQ(window(), capture_mode_session->GetSelectedWindow()); } class CameraPreviewBoundsTest
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc index 88bbe3d7..318beff2 100644 --- a/ash/capture_mode/capture_mode_session.cc +++ b/ash/capture_mode/capture_mode_session.cc
@@ -1526,13 +1526,6 @@ if (capture_label_widget_) ignore_windows.insert(capture_label_widget_->GetNativeWindow()); - auto* camera_controller = - CaptureModeController::Get()->camera_controller(); - if (camera_controller && camera_controller->camera_preview_widget()) { - ignore_windows.insert( - camera_controller->camera_preview_widget()->GetNativeWindow()); - } - capture_window_observer_->UpdateSelectedWindowAtPosition( screen_location, ignore_windows); }
diff --git a/ash/capture_mode/capture_window_observer.cc b/ash/capture_mode/capture_window_observer.cc index eaa77fb..9a05784 100644 --- a/ash/capture_mode/capture_window_observer.cc +++ b/ash/capture_mode/capture_window_observer.cc
@@ -34,9 +34,17 @@ if (capture_mode_session_->IsInCountDownAnimation()) return; location_in_screen_ = location_in_screen; + + std::set<aura::Window*> updated_ignore_windows(ignore_windows); + auto* camera_controller = CaptureModeController::Get()->camera_controller(); + if (camera_controller && camera_controller->camera_preview_widget()) { + updated_ignore_windows.insert( + camera_controller->camera_preview_widget()->GetNativeWindow()); + } + // Find the toplevel window under the mouse/touch position. aura::Window* window = - GetTopmostWindowAtPoint(location_in_screen_, ignore_windows); + GetTopmostWindowAtPoint(location_in_screen_, updated_ignore_windows); SetSelectedWindow(window); capture_mode_session_->UpdateCursor(location_in_screen, /*is_touch=*/false); }
diff --git a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc index a163f63..8528a5c 100644 --- a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc +++ b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc
@@ -106,7 +106,7 @@ UnionTraits<arc::mojom::BitrateDataView, media::Bitrate>::constant( const media::Bitrate& input) { arc::mojom::ConstantBitrate constant_bitrate; - constant_bitrate.target = input.target(); + constant_bitrate.target = input.target_bps(); return constant_bitrate; } @@ -115,8 +115,8 @@ UnionTraits<arc::mojom::BitrateDataView, media::Bitrate>::variable( const media::Bitrate& input) { arc::mojom::VariableBitrate variable_bitrate; - variable_bitrate.target = input.target(); - variable_bitrate.peak = input.peak(); + variable_bitrate.target = input.target_bps(); + variable_bitrate.peak = input.peak_bps(); return variable_bitrate; } @@ -180,9 +180,9 @@ return false; if (bitrate.has_value()) { DCHECK((bitrate->mode() == media::Bitrate::Mode::kVariable) || - (bitrate->peak() == 0u)); + (bitrate->peak_bps() == 0u)); DCHECK((bitrate->mode() == media::Bitrate::Mode::kConstant) || - (bitrate->peak() >= bitrate->target())); + (bitrate->peak_bps() >= bitrate->target_bps())); } else { bitrate = media::Bitrate::ConstantBitrate(input.initial_bitrate_deprecated());
diff --git a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.h b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.h index ca6f54b1..f8e2f547 100644 --- a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.h +++ b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.h
@@ -105,7 +105,7 @@ static uint32_t initial_bitrate_deprecated( const media::VideoEncodeAccelerator::Config& input) { - return input.bitrate.target(); + return input.bitrate.target_bps(); } static uint32_t initial_framerate(
diff --git a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc index 0d9dc90..d35e4577 100644 --- a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc +++ b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc
@@ -43,7 +43,7 @@ output_bitrate); EXPECT_EQ(input_bitrate, output_bitrate); - EXPECT_EQ(output_bitrate.target(), std::numeric_limits<uint32_t>::max()); + EXPECT_EQ(output_bitrate.target_bps(), std::numeric_limits<uint32_t>::max()); } TEST(BitrateDataViewUnionTraitsTest, VariableBitrateMaximumTargetAndPeak) { @@ -56,8 +56,8 @@ output_bitrate); EXPECT_EQ(input_bitrate, output_bitrate); - EXPECT_EQ(output_bitrate.target(), std::numeric_limits<uint32_t>::max()); - EXPECT_EQ(output_bitrate.peak(), std::numeric_limits<uint32_t>::max()); + EXPECT_EQ(output_bitrate.target_bps(), std::numeric_limits<uint32_t>::max()); + EXPECT_EQ(output_bitrate.peak_bps(), std::numeric_limits<uint32_t>::max()); } TEST(VideoEncodeAcceleratorConfigStructTraitTest, RoundTrip) {
diff --git a/ash/components/arc/session/arc_vm_client_adapter.cc b/ash/components/arc/session/arc_vm_client_adapter.cc index 75d34d6..8f76e78 100644 --- a/ash/components/arc/session/arc_vm_client_adapter.cc +++ b/ash/components/arc/session/arc_vm_client_adapter.cc
@@ -105,6 +105,8 @@ constexpr base::TimeDelta kConnectSleepDurationInitial = base::Milliseconds(100); +constexpr const char kEmptyDiskPath[] = "/dev/null"; + absl::optional<base::TimeDelta> g_connect_timeout_limit_for_testing; absl::optional<base::TimeDelta> g_connect_sleep_duration_initial_for_testing; absl::optional<int> g_boot_notification_server_fd; @@ -409,15 +411,36 @@ disk_image->set_block_size(kBlockSize); // Add /run/imageloader/.../android_demo_apps.squash as /dev/block/vdc if - // needed. + // needed. If it's not needed we pass /dev/null so that /dev/block/vdc + // always corresponds to the demo image. + disk_image = request.add_disks(); + disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO); + disk_image->set_writable(false); + disk_image->set_do_mount(true); if (!demo_session_apps_path.empty()) { - disk_image = request.add_disks(); disk_image->set_path(demo_session_apps_path.value()); - disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO); - disk_image->set_writable(false); - disk_image->set_do_mount(true); if (should_set_blocksize) disk_image->set_block_size(kBlockSize); + } else { + // This should never be mounted as it's only mounted if + // ro.boot.arc_demo_mode is set. + disk_image->set_path(kEmptyDiskPath); + } + + // Add /opt/google/vms/android/apex/payload.img as /dev/block/vdd if + // needed. If it's not needed we pass /dev/null so that /dev/block/vdd + // always corresponds to the block apex composite disk. + disk_image = request.add_disks(); + disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO); + disk_image->set_writable(false); + disk_image->set_do_mount(true); + if (!file_system_status.block_apex_path().empty()) { + disk_image->set_path(file_system_status.block_apex_path().value()); + } else { + // Android will not mount this is the system property + // apexd.payload_metadata.path is not set, and it should + // always be set if the block apex payload exists. + disk_image->set_path(kEmptyDiskPath); } // Add Android fstab.
diff --git a/ash/components/arc/session/arc_vm_client_adapter_unittest.cc b/ash/components/arc/session/arc_vm_client_adapter_unittest.cc index 54a92d4..7aa00ac 100644 --- a/ash/components/arc/session/arc_vm_client_adapter_unittest.cc +++ b/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -614,6 +614,10 @@ return boot_server_.get(); } + void set_block_apex_path(base::FilePath block_apex_path) { + block_apex_path_ = block_apex_path; + } + void set_host_rootfs_writable(bool host_rootfs_writable) { host_rootfs_writable_ = host_rootfs_writable; } @@ -629,6 +633,7 @@ private: void RewriteStatus(FileSystemStatus* status) { + status->set_block_apex_path_for_testing(block_apex_path_); status->set_host_rootfs_writable_for_testing(host_rootfs_writable_); status->set_system_image_ext_format_for_testing(system_image_ext_format_); } @@ -642,6 +647,7 @@ ArcServiceManager arc_service_manager_; // Variables to override the value in FileSystemStatus. + base::FilePath block_apex_path_; bool host_rootfs_writable_; bool system_image_ext_format_; @@ -2145,6 +2151,38 @@ EXPECT_FALSE(request.has_balloon_policy()); } +// Test that the request passes an empty disk for the demo image +// or the block apex composite disk when they are not present. +// There should be two empty disks (/dev/block/vdc and /dev/block/vdd) +// and they should have path /dev/null. +TEST_F(ArcVmClientAdapterTest, ArcVmEmptyVirtualDisksExist) { + StartMiniArc(); + + auto request = GetTestConciergeClient()->start_arc_vm_request(); + EXPECT_EQ(request.disks(1).path(), "/dev/null"); + EXPECT_EQ(request.disks(2).path(), "/dev/null"); +} + +// Test that block apex disk path exists when the composite disk payload +// exists. +TEST_F(ArcVmClientAdapterTest, ArcVmBlockApexDiskExists) { + constexpr const char path[] = "/opt/google/vms/android/apex/payload.img"; + set_block_apex_path(base::FilePath(path)); + StartMiniArc(); + auto request = GetTestConciergeClient()->start_arc_vm_request(); + EXPECT_TRUE(base::Contains(request.disks(), path, + [](const auto& p) { return p.path(); })); +} + +// Test that the block apex disk path isn't included when it doesn't exist. +TEST_F(ArcVmClientAdapterTest, ArcVmNoBlockApexDisk) { + constexpr const char path[] = "/opt/google/vms/android/apex/payload.img"; + StartMiniArc(); + auto request = GetTestConciergeClient()->start_arc_vm_request(); + EXPECT_FALSE(base::Contains(request.disks(), path, + [](const auto& p) { return p.path(); })); +} + // Tests that OnConnectionReady() calls the MakeRtVcpu call D-Bus method. TEST_F(ArcVmClientAdapterTest, OnConnectionReady) { StartParams start_params(GetPopulatedStartParams());
diff --git a/ash/components/arc/session/file_system_status.cc b/ash/components/arc/session/file_system_status.cc index 411c5e0..607bd98 100644 --- a/ash/components/arc/session/file_system_status.cc +++ b/ash/components/arc/session/file_system_status.cc
@@ -24,6 +24,10 @@ constexpr const char kKernel[] = "vmlinux"; constexpr const char kRootFs[] = "system.raw.img"; constexpr const char kVendorImage[] = "vendor.raw.img"; +// Path to block apex payload. This is a composite disk containing +// Android apexes which will be mounted as block devices. +// This is a relative path starting from kBuiltinPath. +constexpr const char kBlockApexPath[] = "apex/payload.img"; } // namespace @@ -39,7 +43,11 @@ guest_kernel_path_(base::FilePath(kBuiltinPath).Append(kKernel)), fstab_path_(kFstabPath), is_system_image_ext_format_(IsSystemImageExtFormat(system_image_path_)), - has_adbd_json_(base::PathExists(base::FilePath(kAdbdJson))) {} + has_adbd_json_(base::PathExists(base::FilePath(kAdbdJson))) { + auto apex_path = base::FilePath(kBuiltinPath).Append(kBlockApexPath); + block_apex_path_ = + base::PathExists(apex_path) ? apex_path : base::FilePath(""); +} // static bool FileSystemStatus::IsHostRootfsWritable() {
diff --git a/ash/components/arc/session/file_system_status.h b/ash/components/arc/session/file_system_status.h index d2901c3a..f313bb8 100644 --- a/ash/components/arc/session/file_system_status.h +++ b/ash/components/arc/session/file_system_status.h
@@ -34,6 +34,7 @@ const base::FilePath& vendor_image_path() const { return vendor_image_path_; } const base::FilePath& guest_kernel_path() const { return guest_kernel_path_; } const base::FilePath& fstab_path() const { return fstab_path_; } + const base::FilePath& block_apex_path() const { return block_apex_path_; } // Setters for testing. void set_host_rootfs_writable_for_testing(bool is_host_rootfs_writable) { @@ -58,6 +59,9 @@ void set_fstab_path_for_testing(const base::FilePath& fstab_path) { fstab_path_ = fstab_path; } + void set_block_apex_path_for_testing(const base::FilePath& block_apex_path) { + block_apex_path_ = block_apex_path; + } static bool IsSystemImageExtFormatForTesting(const base::FilePath& path) { return IsSystemImageExtFormat(path); @@ -78,6 +82,7 @@ base::FilePath vendor_image_path_; base::FilePath guest_kernel_path_; base::FilePath fstab_path_; + base::FilePath block_apex_path_; bool is_system_image_ext_format_; bool has_adbd_json_; };
diff --git a/ash/components/drivefs/fake_drivefs.cc b/ash/components/drivefs/fake_drivefs.cc index 22f2dfd..4a5edfc 100644 --- a/ash/components/drivefs/fake_drivefs.cc +++ b/ash/components/drivefs/fake_drivefs.cc
@@ -510,8 +510,9 @@ mojom::QuotaUsage::New()); } -void FakeDriveFs::EnableMirroring( - drivefs::mojom::DriveFs::EnableMirroringCallback callback) { +void FakeDriveFs::ToggleMirroring( + bool enabled, + drivefs::mojom::DriveFs::ToggleMirroringCallback callback) { std::move(callback).Run(drivefs::mojom::MirrorSyncStatus::kSuccess); }
diff --git a/ash/components/drivefs/fake_drivefs.h b/ash/components/drivefs/fake_drivefs.h index 07fe894..b3dcda2d 100644 --- a/ash/components/drivefs/fake_drivefs.h +++ b/ash/components/drivefs/fake_drivefs.h
@@ -144,8 +144,9 @@ void GetQuotaUsage( drivefs::mojom::DriveFs::GetQuotaUsageCallback callback) override; - void EnableMirroring( - drivefs::mojom::DriveFs::EnableMirroringCallback callback) override; + void ToggleMirroring( + bool enabled, + drivefs::mojom::DriveFs::ToggleMirroringCallback callback) override; const base::FilePath mount_path_; int64_t next_stable_id_ = 1;
diff --git a/ash/components/drivefs/mojom/drivefs.mojom b/ash/components/drivefs/mojom/drivefs.mojom index b17bbb24..5364f02 100644 --- a/ash/components/drivefs/mojom/drivefs.mojom +++ b/ash/components/drivefs/mojom/drivefs.mojom
@@ -109,8 +109,8 @@ // Returns the total and free space available in the user's Drive. GetQuotaUsage() => (FileError error, QuotaUsage quota); - // Turn on mirror sync capability. - EnableMirroring() => (MirrorSyncStatus status); + // Toggle mirror sync capability. + ToggleMirroring(bool enabled) => (MirrorSyncStatus status); }; // Implemented by Chrome, used from DriveFS.
diff --git a/ash/components/phonehub/tether_controller_impl.h b/ash/components/phonehub/tether_controller_impl.h index 6b2624b..78d1076 100644 --- a/ash/components/phonehub/tether_controller_impl.h +++ b/ash/components/phonehub/tether_controller_impl.h
@@ -139,6 +139,7 @@ void OnDeviceStateListChanged() override; void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} void AttemptTurningOnTethering(); void OnSetFeatureEnabled(bool success);
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index f8f0767..419e98d 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -358,12 +358,12 @@ "//ash/constants", "//ash/public/cpp/ambient/proto", "//ash/resources/vector_icons", + "//ash/services/cellular_setup:in_process_esim_manager", "//ash/strings", "//base", "//chromeos/dbus/power:power_manager_proto", "//chromeos/services/assistant/public/cpp", "//chromeos/services/bluetooth_config:in_process_bluetooth_config", - "//chromeos/services/cellular_setup:in_process_esim_manager", "//chromeos/services/network_config:in_process_instance", "//chromeos/strings:strings_grit", "//chromeos/ui/base", @@ -393,12 +393,12 @@ "//ash/components/arc/mojom:notifications", "//ash/components/security_token_pin", "//ash/public/mojom", + "//ash/services/cellular_setup/public/mojom", "//ash/webui/personalization_app/proto", "//base", "//chromeos/crosapi/mojom", "//chromeos/services/assistant/public/mojom", "//chromeos/services/bluetooth_config/public/mojom", - "//chromeos/services/cellular_setup/public/mojom", "//chromeos/services/network_config/public/mojom", "//components/app_restore", "//components/session_manager:base",
diff --git a/ash/public/cpp/esim_manager.cc b/ash/public/cpp/esim_manager.cc index e23d6f8..30b4f0e 100644 --- a/ash/public/cpp/esim_manager.cc +++ b/ash/public/cpp/esim_manager.cc
@@ -4,7 +4,7 @@ #include "ash/public/cpp/esim_manager.h" -#include "chromeos/services/cellular_setup/in_process_esim_manager.h" +#include "ash/services/cellular_setup/in_process_esim_manager.h" namespace ash {
diff --git a/ash/public/cpp/esim_manager.h b/ash/public/cpp/esim_manager.h index 59645f7..d74e89e 100644 --- a/ash/public/cpp/esim_manager.h +++ b/ash/public/cpp/esim_manager.h
@@ -6,7 +6,7 @@ #define ASH_PUBLIC_CPP_ESIM_MANAGER_H_ #include "ash/public/cpp/ash_public_export.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" namespace ash {
diff --git a/ash/quick_pair/common/BUILD.gn b/ash/quick_pair/common/BUILD.gn index e8833f1e..e0828a2c 100644 --- a/ash/quick_pair/common/BUILD.gn +++ b/ash/quick_pair/common/BUILD.gn
@@ -82,6 +82,7 @@ "device_unittest.cc", "fast_pair/fast_pair_decoder_unittest.cc", "fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc", + "log_buffer_unittest.cc", "logging_unittest.cc", ]
diff --git a/ash/quick_pair/common/log_buffer_unittest.cc b/ash/quick_pair/common/log_buffer_unittest.cc new file mode 100644 index 0000000..cf3b89b --- /dev/null +++ b/ash/quick_pair/common/log_buffer_unittest.cc
@@ -0,0 +1,49 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/quick_pair/common/log_buffer.h" + +#include <stddef.h> + +#include "base/time/time.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { +namespace quick_pair { + +class QuickPairLogBufferTest : public testing::Test, + public LogBuffer::Observer { + public: + void SetUp() override { + log_buffer_ = LogBuffer::GetInstance(); + log_buffer_->AddObserver(this); + } + + void TearDown() override { log_buffer_->RemoveObserver(this); } + + void OnLogMessageAdded(const LogBuffer::LogMessage& log_message) override { + log_messages_.push_back(log_message); + } + + void OnLogBufferCleared() override { log_messages_.clear(); } + + protected: + std::vector<LogBuffer::LogMessage> log_messages_; + LogBuffer* log_buffer_ = nullptr; +}; + +TEST_F(QuickPairLogBufferTest, ObserversNotifiedWhenLogsAdded) { + LogBuffer::GetInstance()->AddLogMessage(LogBuffer::LogMessage( + /*text=*/"text", /*time=*/base::Time::Now(), /*file=*/"file", /*line=*/0, + /*severity=*/logging::LOGGING_WARNING)); + EXPECT_EQ(log_messages_.size(), 1u); +} + +TEST_F(QuickPairLogBufferTest, ObserversNotifiedWhenLogBufferCleared) { + LogBuffer::GetInstance()->Clear(); + EXPECT_EQ(log_messages_.size(), 0u); +} + +} // namespace quick_pair +} // namespace ash
diff --git a/ash/resources/BUILD.gn b/ash/resources/BUILD.gn index b07997f..1fe2433 100644 --- a/ash/resources/BUILD.gn +++ b/ash/resources/BUILD.gn
@@ -27,6 +27,7 @@ ] deps = [ + "//ash/services/cellular_setup/public/mojom:mojom_js", "//ash/services/multidevice_setup/public/mojom:mojom_js", "//chromeos/components/multidevice/mojom:mojom_js", "//chromeos/services/device_sync/public/mojom:mojom_js",
diff --git a/ash/resources/ash_resources.grd b/ash/resources/ash_resources.grd index 4c871b64..be9f30d 100644 --- a/ash/resources/ash_resources.grd +++ b/ash/resources/ash_resources.grd
@@ -12,6 +12,7 @@ </outputs> <release seq="1"> <includes> + <part file="cellular_resources.grdp" /> <part file="multidevice_resources.grdp" /> </includes> </release>
diff --git a/ash/resources/cellular_resources.grdp b/ash/resources/cellular_resources.grdp new file mode 100644 index 0000000..6a34add --- /dev/null +++ b/ash/resources/cellular_resources.grdp
@@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <include name="IDR_CELLULAR_SETUP_MOJOM_HTML" + file="${mojom_root}/ash/services/cellular_setup/public/mojom/cellular_setup.mojom.html" + resource_path="mojo/ash/services/cellular_setup/public/mojom/cellular_setup.mojom.html" + use_base_dir="false" + type="BINDATA" /> + <include name="IDR_CELLULAR_SETUP_MOJOM_LITE_JS" + file="${mojom_root}/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js" + resource_path="mojo/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js" + use_base_dir="false" + type="BINDATA" /> + <include name="IDR_ESIM_MANAGER_MOJOM_HTML" + file="${mojom_root}/ash/services/cellular_setup/public/mojom/esim_manager.mojom.html" + resource_path="mojo/ash/services/cellular_setup/public/mojom/esim_manager.mojom.html" + use_base_dir="false" + type="BINDATA" /> + <include name="IDR_ESIM_MANAGER_MOJOM_LITE_JS" + file="${mojom_root}/ash/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js" + resource_path="mojo/ash/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js" + use_base_dir="false" + type="BINDATA" /> +</grit-part>
diff --git a/ash/services/BUILD.gn b/ash/services/BUILD.gn index db0cea95..24f4fafc 100644 --- a/ash/services/BUILD.gn +++ b/ash/services/BUILD.gn
@@ -16,6 +16,7 @@ source_set("unit_tests") { testonly = true deps = [ + "//ash/services/cellular_setup:unit_tests", "//ash/services/ime:services_unittests", "//ash/services/ime:unit_tests", "//ash/services/multidevice_setup:unit_tests",
diff --git a/chromeos/services/cellular_setup/BUILD.gn b/ash/services/cellular_setup/BUILD.gn similarity index 83% rename from chromeos/services/cellular_setup/BUILD.gn rename to ash/services/cellular_setup/BUILD.gn index 959c0b50..31e368e 100644 --- a/chromeos/services/cellular_setup/BUILD.gn +++ b/ash/services/cellular_setup/BUILD.gn
@@ -2,7 +2,9 @@ # 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") +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash) static_library("cellular_setup") { sources = [ @@ -17,10 +19,10 @@ ] deps = [ + "//ash/services/cellular_setup/public/mojom", "//base", "//chromeos/dbus/shill", "//chromeos/network", - "//chromeos/services/cellular_setup/public/mojom", "//dbus", "//url", ] @@ -40,10 +42,10 @@ deps = [ "//ash/constants", + "//ash/services/cellular_setup/public/mojom", "//base", "//chromeos/dbus/hermes", "//chromeos/network", - "//chromeos/services/cellular_setup/public/mojom", "//components/device_event_log", "//components/qr_code_generator", "//components/user_manager", @@ -60,13 +62,13 @@ defines = [ "IS_IN_PROCESS_ESIM_MANAGER_IMPL" ] public_deps = [ - "//chromeos/services/cellular_setup/public/mojom", + "//ash/services/cellular_setup/public/mojom", "//mojo/public/cpp/bindings", ] deps = [ ":esim_manager", - "//chromeos/services/cellular_setup/public/mojom", + "//ash/services/cellular_setup/public/mojom", "//dbus", "//mojo/public/cpp/bindings", ] @@ -84,8 +86,8 @@ deps = [ ":cellular_setup", + "//ash/services/cellular_setup/public/cpp:test_support", "//base", - "//chromeos/services/cellular_setup/public/cpp:test_support", ] } @@ -107,12 +109,12 @@ ":cellular_setup", ":esim_manager", ":test_support", + "//ash/services/cellular_setup/public/cpp:test_support", "//base", "//base/test:test_support", "//chromeos/dbus/hermes", "//chromeos/dbus/shill", "//chromeos/network:test_support", - "//chromeos/services/cellular_setup/public/cpp:test_support", "//components/user_manager:test_support", "//dbus", "//testing/gmock",
diff --git a/chromeos/services/cellular_setup/DEPS b/ash/services/cellular_setup/DEPS similarity index 66% rename from chromeos/services/cellular_setup/DEPS rename to ash/services/cellular_setup/DEPS index 82f84ccb..72ac779e 100644 --- a/chromeos/services/cellular_setup/DEPS +++ b/ash/services/cellular_setup/DEPS
@@ -1,6 +1,6 @@ include_rules = [ - "+dbus/object_path.h", + "+ash/constants", + "+components/device_event_log", "+components/qr_code_generator/qr_code_generator.h", "+components/user_manager", - "+mojo/public", ]
diff --git a/chromeos/services/cellular_setup/OWNERS b/ash/services/cellular_setup/OWNERS similarity index 100% rename from chromeos/services/cellular_setup/OWNERS rename to ash/services/cellular_setup/OWNERS
diff --git a/chromeos/services/cellular_setup/cellular_setup_base.cc b/ash/services/cellular_setup/cellular_setup_base.cc similarity index 88% rename from chromeos/services/cellular_setup/cellular_setup_base.cc rename to ash/services/cellular_setup/cellular_setup_base.cc index 85034ef6..abf1ab2 100644 --- a/chromeos/services/cellular_setup/cellular_setup_base.cc +++ b/ash/services/cellular_setup/cellular_setup_base.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/cellular_setup_base.h" +#include "ash/services/cellular_setup/cellular_setup_base.h" namespace chromeos {
diff --git a/chromeos/services/cellular_setup/cellular_setup_base.h b/ash/services/cellular_setup/cellular_setup_base.h similarity index 77% rename from chromeos/services/cellular_setup/cellular_setup_base.h rename to ash/services/cellular_setup/cellular_setup_base.h index 18ce64f..021e65b 100644 --- a/chromeos/services/cellular_setup/cellular_setup_base.h +++ b/ash/services/cellular_setup/cellular_setup_base.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ +#define ASH_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -36,4 +36,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_BASE_H_
diff --git a/chromeos/services/cellular_setup/cellular_setup_impl.cc b/ash/services/cellular_setup/cellular_setup_impl.cc similarity index 93% rename from chromeos/services/cellular_setup/cellular_setup_impl.cc rename to ash/services/cellular_setup/cellular_setup_impl.cc index b43db37..8cda75be 100644 --- a/chromeos/services/cellular_setup/cellular_setup_impl.cc +++ b/ash/services/cellular_setup/cellular_setup_impl.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/cellular_setup_impl.h" +#include "ash/services/cellular_setup/cellular_setup_impl.h" #include <utility> +#include "ash/services/cellular_setup/ota_activator_impl.h" #include "base/bind.h" #include "base/memory/ptr_util.h" #include "chromeos/network/network_handler.h" -#include "chromeos/services/cellular_setup/ota_activator_impl.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" namespace chromeos {
diff --git a/chromeos/services/cellular_setup/cellular_setup_impl.h b/ash/services/cellular_setup/cellular_setup_impl.h similarity index 85% rename from chromeos/services/cellular_setup/cellular_setup_impl.h rename to ash/services/cellular_setup/cellular_setup_impl.h index 0ebc1e5..bf8b0ba 100644 --- a/chromeos/services/cellular_setup/cellular_setup_impl.h +++ b/ash/services/cellular_setup/cellular_setup_impl.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ +#define ASH_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ #include <memory> +#include "ash/services/cellular_setup/cellular_setup_base.h" #include "base/containers/id_map.h" #include "base/memory/weak_ptr.h" -#include "chromeos/services/cellular_setup/cellular_setup_base.h" #include "mojo/public/cpp/bindings/pending_remote.h" namespace chromeos { @@ -54,4 +54,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_CELLULAR_SETUP_IMPL_H_
diff --git a/chromeos/services/cellular_setup/cellular_setup_impl_unittest.cc b/ash/services/cellular_setup/cellular_setup_impl_unittest.cc similarity index 91% rename from chromeos/services/cellular_setup/cellular_setup_impl_unittest.cc rename to ash/services/cellular_setup/cellular_setup_impl_unittest.cc index 69e9489..107c2e0 100644 --- a/chromeos/services/cellular_setup/cellular_setup_impl_unittest.cc +++ b/ash/services/cellular_setup/cellular_setup_impl_unittest.cc
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/cellular_setup_impl.h" +#include "ash/services/cellular_setup/cellular_setup_impl.h" #include <memory> #include <utility> #include <vector> +#include "ash/services/cellular_setup/cellular_setup_base.h" +#include "ash/services/cellular_setup/cellular_setup_impl.h" +#include "ash/services/cellular_setup/fake_ota_activator.h" +#include "ash/services/cellular_setup/ota_activator_impl.h" +#include "ash/services/cellular_setup/public/cpp/fake_activation_delegate.h" #include "base/run_loop.h" #include "base/test/task_environment.h" #include "chromeos/network/network_handler_test_helper.h" -#include "chromeos/services/cellular_setup/cellular_setup_base.h" -#include "chromeos/services/cellular_setup/cellular_setup_impl.h" -#include "chromeos/services/cellular_setup/fake_ota_activator.h" -#include "chromeos/services/cellular_setup/ota_activator_impl.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromeos/services/cellular_setup/cellular_setup_service_unittest.cc b/ash/services/cellular_setup/cellular_setup_service_unittest.cc similarity index 95% rename from chromeos/services/cellular_setup/cellular_setup_service_unittest.cc rename to ash/services/cellular_setup/cellular_setup_service_unittest.cc index 0396ef6..eb3c3ef 100644 --- a/chromeos/services/cellular_setup/cellular_setup_service_unittest.cc +++ b/ash/services/cellular_setup/cellular_setup_service_unittest.cc
@@ -5,15 +5,15 @@ #include <memory> #include <utility> +#include "ash/services/cellular_setup/cellular_setup_impl.h" +#include "ash/services/cellular_setup/public/cpp/fake_activation_delegate.h" +#include "ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" +#include "ash/services/cellular_setup/public/cpp/fake_cellular_setup.h" +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/run_loop.h" #include "base/test/task_environment.h" -#include "chromeos/services/cellular_setup/cellular_setup_impl.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h" -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromeos/services/cellular_setup/esim_manager.cc b/ash/services/cellular_setup/esim_manager.cc similarity index 96% rename from chromeos/services/cellular_setup/esim_manager.cc rename to ash/services/cellular_setup/esim_manager.cc index fe8ffa5..6f6e1f4 100644 --- a/chromeos/services/cellular_setup/esim_manager.cc +++ b/ash/services/cellular_setup/esim_manager.cc
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/esim_manager.h" +#include "ash/services/cellular_setup/esim_manager.h" #include <sstream> #include "ash/constants/ash_features.h" +#include "ash/services/cellular_setup/esim_profile.h" +#include "ash/services/cellular_setup/euicc.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/strings/utf_string_conversions.h" #include "chromeos/dbus/hermes/hermes_manager_client.h" #include "chromeos/network/network_event_log.h" #include "chromeos/network/network_handler.h" -#include "chromeos/services/cellular_setup/esim_profile.h" -#include "chromeos/services/cellular_setup/euicc.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "components/device_event_log/device_event_log.h" #include "dbus/object_path.h" #include "third_party/cros_system_api/dbus/hermes/dbus-constants.h"
diff --git a/chromeos/services/cellular_setup/esim_manager.h b/ash/services/cellular_setup/esim_manager.h similarity index 94% rename from chromeos/services/cellular_setup/esim_manager.h rename to ash/services/cellular_setup/esim_manager.h index d5c7347..ce3b8ab 100644 --- a/chromeos/services/cellular_setup/esim_manager.h +++ b/ash/services/cellular_setup/esim_manager.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_MANAGER_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_MANAGER_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_ESIM_MANAGER_H_ +#define ASH_SERVICES_CELLULAR_SETUP_ESIM_MANAGER_H_ +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/memory/weak_ptr.h" #include "chromeos/dbus/hermes/hermes_euicc_client.h" #include "chromeos/dbus/hermes/hermes_manager_client.h" #include "chromeos/dbus/hermes/hermes_profile_client.h" #include "chromeos/network/cellular_esim_profile_handler.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote_set.h" @@ -135,4 +135,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_MANAGER_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_ESIM_MANAGER_H_
diff --git a/chromeos/services/cellular_setup/esim_manager_unittest.cc b/ash/services/cellular_setup/esim_manager_unittest.cc similarity index 93% rename from chromeos/services/cellular_setup/esim_manager_unittest.cc rename to ash/services/cellular_setup/esim_manager_unittest.cc index 778bd8eb..b6d98e1 100644 --- a/chromeos/services/cellular_setup/esim_manager_unittest.cc +++ b/ash/services/cellular_setup/esim_manager_unittest.cc
@@ -2,12 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/esim_manager.h" +#include "ash/services/cellular_setup/esim_manager.h" + +#include "ash/services/cellular_setup/esim_test_base.h" +#include "ash/services/cellular_setup/esim_test_utils.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "chromeos/dbus/hermes/hermes_clients.h" #include "chromeos/dbus/hermes/hermes_euicc_client.h" -#include "chromeos/services/cellular_setup/esim_test_base.h" -#include "chromeos/services/cellular_setup/esim_test_utils.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "third_party/cros_system_api/dbus/hermes/dbus-constants.h" namespace chromeos {
diff --git a/chromeos/services/cellular_setup/esim_mojo_utils.cc b/ash/services/cellular_setup/esim_mojo_utils.cc similarity index 92% rename from chromeos/services/cellular_setup/esim_mojo_utils.cc rename to ash/services/cellular_setup/esim_mojo_utils.cc index b2f9ba1..eb2b0bb1 100644 --- a/chromeos/services/cellular_setup/esim_mojo_utils.cc +++ b/ash/services/cellular_setup/esim_mojo_utils.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/esim_mojo_utils.h" +#include "ash/services/cellular_setup/esim_mojo_utils.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" namespace chromeos { namespace cellular_setup { @@ -52,4 +52,4 @@ } } // namespace cellular_setup -} // namespace chromeos \ No newline at end of file +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/esim_mojo_utils.h b/ash/services/cellular_setup/esim_mojo_utils.h similarity index 78% rename from chromeos/services/cellular_setup/esim_mojo_utils.h rename to ash/services/cellular_setup/esim_mojo_utils.h index dd6807b..b001f50d 100644 --- a/chromeos/services/cellular_setup/esim_mojo_utils.h +++ b/ash/services/cellular_setup/esim_mojo_utils.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_MOJO_UTILS_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_MOJO_UTILS_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_ESIM_MOJO_UTILS_H_ +#define ASH_SERVICES_CELLULAR_SETUP_ESIM_MOJO_UTILS_H_ +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "chromeos/dbus/hermes/hermes_response_status.h" #include "chromeos/network/cellular_esim_profile.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "third_party/cros_system_api/dbus/hermes/dbus-constants.h" namespace chromeos { @@ -29,4 +29,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_MOJO_UTILS_H_ \ No newline at end of file +#endif // ASH_SERVICES_CELLULAR_SETUP_ESIM_MOJO_UTILS_H_
diff --git a/chromeos/services/cellular_setup/esim_profile.cc b/ash/services/cellular_setup/esim_profile.cc similarity index 97% rename from chromeos/services/cellular_setup/esim_profile.cc rename to ash/services/cellular_setup/esim_profile.cc index 1eb0982..9ecf8cde 100644 --- a/chromeos/services/cellular_setup/esim_profile.cc +++ b/ash/services/cellular_setup/esim_profile.cc
@@ -2,9 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/esim_profile.h" +#include "ash/services/cellular_setup/esim_profile.h" #include "ash/constants/ash_features.h" +#include "ash/services/cellular_setup/esim_manager.h" +#include "ash/services/cellular_setup/esim_mojo_utils.h" +#include "ash/services/cellular_setup/euicc.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/utf_string_conversions.h" @@ -20,11 +25,6 @@ #include "chromeos/network/network_event_log.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_state_handler.h" -#include "chromeos/services/cellular_setup/esim_manager.h" -#include "chromeos/services/cellular_setup/esim_mojo_utils.h" -#include "chromeos/services/cellular_setup/euicc.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "components/device_event_log/device_event_log.h" #include "components/user_manager/user_manager.h" #include "dbus/object_path.h"
diff --git a/chromeos/services/cellular_setup/esim_profile.h b/ash/services/cellular_setup/esim_profile.h similarity index 94% rename from chromeos/services/cellular_setup/esim_profile.h rename to ash/services/cellular_setup/esim_profile.h index e13a7e3..a58f8dc 100644 --- a/chromeos/services/cellular_setup/esim_profile.h +++ b/ash/services/cellular_setup/esim_profile.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_PROFILE_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_PROFILE_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_ESIM_PROFILE_H_ +#define ASH_SERVICES_CELLULAR_SETUP_ESIM_PROFILE_H_ +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/memory/weak_ptr.h" #include "chromeos/dbus/hermes/hermes_profile_client.h" #include "chromeos/dbus/hermes/hermes_response_status.h" #include "chromeos/network/cellular_inhibitor.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/receiver_set.h" namespace dbus { @@ -122,4 +122,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_PROFILE_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_ESIM_PROFILE_H_
diff --git a/chromeos/services/cellular_setup/esim_profile_unittest.cc b/ash/services/cellular_setup/esim_profile_unittest.cc similarity index 98% rename from chromeos/services/cellular_setup/esim_profile_unittest.cc rename to ash/services/cellular_setup/esim_profile_unittest.cc index e0dfa203..57e93467 100644 --- a/chromeos/services/cellular_setup/esim_profile_unittest.cc +++ b/ash/services/cellular_setup/esim_profile_unittest.cc
@@ -4,15 +4,15 @@ #include <string> +#include "ash/services/cellular_setup/esim_test_base.h" +#include "ash/services/cellular_setup/esim_test_utils.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "chromeos/dbus/hermes/hermes_euicc_client.h" #include "chromeos/dbus/hermes/hermes_profile_client.h" #include "chromeos/network/fake_network_connection_handler.h" -#include "chromeos/services/cellular_setup/esim_test_base.h" -#include "chromeos/services/cellular_setup/esim_test_utils.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" #include "components/user_manager/fake_user_manager.h" #include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/chromeos/services/cellular_setup/esim_test_base.cc b/ash/services/cellular_setup/esim_test_base.cc similarity index 95% rename from chromeos/services/cellular_setup/esim_test_base.cc rename to ash/services/cellular_setup/esim_test_base.cc index 7f78e1d1..1198530 100644 --- a/chromeos/services/cellular_setup/esim_test_base.cc +++ b/ash/services/cellular_setup/esim_test_base.cc
@@ -2,10 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/esim_test_base.h" +#include "ash/services/cellular_setup/esim_test_base.h" #include <memory> +#include "ash/services/cellular_setup/esim_manager.h" +#include "ash/services/cellular_setup/esim_test_utils.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "chromeos/dbus/hermes/hermes_clients.h" #include "chromeos/dbus/hermes/hermes_euicc_client.h" #include "chromeos/dbus/hermes/hermes_manager_client.h" @@ -21,9 +24,6 @@ #include "chromeos/network/network_profile_handler.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/test_cellular_esim_profile_handler.h" -#include "chromeos/services/cellular_setup/esim_manager.h" -#include "chromeos/services/cellular_setup/esim_test_utils.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" namespace chromeos { namespace cellular_setup {
diff --git a/chromeos/services/cellular_setup/esim_test_base.h b/ash/services/cellular_setup/esim_test_base.h similarity index 89% rename from chromeos/services/cellular_setup/esim_test_base.h rename to ash/services/cellular_setup/esim_test_base.h index b3f7045..96f0c9a 100644 --- a/chromeos/services/cellular_setup/esim_test_base.h +++ b/ash/services/cellular_setup/esim_test_base.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_ +#define ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_ +#include "ash/services/cellular_setup/public/cpp/esim_manager_test_observer.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/test/task_environment.h" -#include "chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" @@ -93,4 +93,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_ \ No newline at end of file +#endif // ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_
diff --git a/chromeos/services/cellular_setup/esim_test_utils.cc b/ash/services/cellular_setup/esim_test_utils.cc similarity index 92% rename from chromeos/services/cellular_setup/esim_test_utils.cc rename to ash/services/cellular_setup/esim_test_utils.cc index f886d05..6ac04593 100644 --- a/chromeos/services/cellular_setup/esim_test_utils.cc +++ b/ash/services/cellular_setup/esim_test_utils.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/esim_test_utils.h" +#include "ash/services/cellular_setup/esim_test_utils.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/run_loop.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" namespace chromeos { namespace cellular_setup { @@ -57,4 +57,4 @@ } } // namespace cellular_setup -} // namespace chromeos \ No newline at end of file +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/esim_test_utils.h b/ash/services/cellular_setup/esim_test_utils.h similarity index 79% rename from chromeos/services/cellular_setup/esim_test_utils.h rename to ash/services/cellular_setup/esim_test_utils.h index 38ec7c8..82ee10ea 100644 --- a/chromeos/services/cellular_setup/esim_test_utils.h +++ b/ash/services/cellular_setup/esim_test_utils.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_TEST_UTILS_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_TEST_UTILS_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_UTILS_H_ +#define ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_UTILS_H_ -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "mojo/public/cpp/bindings/remote.h" namespace chromeos { @@ -30,4 +30,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_ESIM_TEST_UTILS_H_ \ No newline at end of file +#endif // ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_UTILS_H_
diff --git a/chromeos/services/cellular_setup/euicc.cc b/ash/services/cellular_setup/euicc.cc similarity index 97% rename from chromeos/services/cellular_setup/euicc.cc rename to ash/services/cellular_setup/euicc.cc index 3e294238..dbe8cdb 100644 --- a/chromeos/services/cellular_setup/euicc.cc +++ b/ash/services/cellular_setup/euicc.cc
@@ -2,11 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/euicc.h" +#include "ash/services/cellular_setup/euicc.h" #include <cstdint> #include <memory> +#include "ash/services/cellular_setup/esim_manager.h" +#include "ash/services/cellular_setup/esim_mojo_utils.h" +#include "ash/services/cellular_setup/esim_profile.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/strcat.h" @@ -19,10 +23,6 @@ #include "chromeos/network/network_connection_handler.h" #include "chromeos/network/network_event_log.h" #include "chromeos/network/network_state_handler.h" -#include "chromeos/services/cellular_setup/esim_manager.h" -#include "chromeos/services/cellular_setup/esim_mojo_utils.h" -#include "chromeos/services/cellular_setup/esim_profile.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" #include "components/device_event_log/device_event_log.h" #include "components/qr_code_generator/qr_code_generator.h" #include "dbus/object_path.h"
diff --git a/chromeos/services/cellular_setup/euicc.h b/ash/services/cellular_setup/euicc.h similarity index 94% rename from chromeos/services/cellular_setup/euicc.h rename to ash/services/cellular_setup/euicc.h index a50efcb..af66e495 100644 --- a/chromeos/services/cellular_setup/euicc.h +++ b/ash/services/cellular_setup/euicc.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_EUICC_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_EUICC_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_EUICC_H_ +#define ASH_SERVICES_CELLULAR_SETUP_EUICC_H_ +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/gtest_prod_util.h" #include "chromeos/dbus/hermes/hermes_euicc_client.h" #include "chromeos/dbus/hermes/hermes_profile_client.h" #include "chromeos/network/cellular_inhibitor.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/receiver_set.h" namespace dbus { @@ -118,4 +118,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_EUICC_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_EUICC_H_
diff --git a/chromeos/services/cellular_setup/euicc_unittest.cc b/ash/services/cellular_setup/euicc_unittest.cc similarity index 98% rename from chromeos/services/cellular_setup/euicc_unittest.cc rename to ash/services/cellular_setup/euicc_unittest.cc index 4507bba..9cff7ad 100644 --- a/chromeos/services/cellular_setup/euicc_unittest.cc +++ b/ash/services/cellular_setup/euicc_unittest.cc
@@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/euicc.h" +#include "ash/services/cellular_setup/euicc.h" #include <utility> +#include "ash/services/cellular_setup/esim_test_base.h" +#include "ash/services/cellular_setup/esim_test_utils.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" @@ -14,8 +16,6 @@ #include "chromeos/network/fake_network_connection_handler.h" #include "chromeos/network/network_type_pattern.h" #include "chromeos/network/test_cellular_esim_profile_handler.h" -#include "chromeos/services/cellular_setup/esim_test_base.h" -#include "chromeos/services/cellular_setup/esim_test_utils.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
diff --git a/chromeos/services/cellular_setup/fake_ota_activator.cc b/ash/services/cellular_setup/fake_ota_activator.cc similarity index 90% rename from chromeos/services/cellular_setup/fake_ota_activator.cc rename to ash/services/cellular_setup/fake_ota_activator.cc index e255c73f..b896533f 100644 --- a/chromeos/services/cellular_setup/fake_ota_activator.cc +++ b/ash/services/cellular_setup/fake_ota_activator.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/fake_ota_activator.h" +#include "ash/services/cellular_setup/fake_ota_activator.h" #include <utility>
diff --git a/chromeos/services/cellular_setup/fake_ota_activator.h b/ash/services/cellular_setup/fake_ota_activator.h similarity index 74% rename from chromeos/services/cellular_setup/fake_ota_activator.h rename to ash/services/cellular_setup/fake_ota_activator.h index 42934bc..33d5643 100644 --- a/chromeos/services/cellular_setup/fake_ota_activator.h +++ b/ash/services/cellular_setup/fake_ota_activator.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_FAKE_OTA_ACTIVATOR_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_FAKE_OTA_ACTIVATOR_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_FAKE_OTA_ACTIVATOR_H_ +#define ASH_SERVICES_CELLULAR_SETUP_FAKE_OTA_ACTIVATOR_H_ +#include "ash/services/cellular_setup/ota_activator.h" +#include "ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" #include "base/callback_forward.h" -#include "chromeos/services/cellular_setup/ota_activator.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" namespace chromeos { @@ -40,4 +40,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_FAKE_OTA_ACTIVATOR_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_FAKE_OTA_ACTIVATOR_H_
diff --git a/chromeos/services/cellular_setup/in_process_esim_manager.cc b/ash/services/cellular_setup/in_process_esim_manager.cc similarity index 79% rename from chromeos/services/cellular_setup/in_process_esim_manager.cc rename to ash/services/cellular_setup/in_process_esim_manager.cc index 7782829..ba5f1a1 100644 --- a/chromeos/services/cellular_setup/in_process_esim_manager.cc +++ b/ash/services/cellular_setup/in_process_esim_manager.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/in_process_esim_manager.h" +#include "ash/services/cellular_setup/in_process_esim_manager.h" +#include "ash/services/cellular_setup/esim_manager.h" #include "base/no_destructor.h" -#include "chromeos/services/cellular_setup/esim_manager.h" namespace chromeos { namespace cellular_setup {
diff --git a/chromeos/services/cellular_setup/in_process_esim_manager.h b/ash/services/cellular_setup/in_process_esim_manager.h similarity index 63% rename from chromeos/services/cellular_setup/in_process_esim_manager.h rename to ash/services/cellular_setup/in_process_esim_manager.h index b61cffd..6e241ed 100644 --- a/chromeos/services/cellular_setup/in_process_esim_manager.h +++ b/ash/services/cellular_setup/in_process_esim_manager.h
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_IN_PROCESS_ESIM_MANAGER_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_IN_PROCESS_ESIM_MANAGER_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_IN_PROCESS_ESIM_MANAGER_H_ +#define ASH_SERVICES_CELLULAR_SETUP_IN_PROCESS_ESIM_MANAGER_H_ +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/component_export.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" namespace chromeos { @@ -19,4 +19,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_IN_PROCESS_ESIM_MANAGER_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_IN_PROCESS_ESIM_MANAGER_H_
diff --git a/chromeos/services/cellular_setup/ota_activator.cc b/ash/services/cellular_setup/ota_activator.cc similarity index 92% rename from chromeos/services/cellular_setup/ota_activator.cc rename to ash/services/cellular_setup/ota_activator.cc index 2cc58cdb..49b407a 100644 --- a/chromeos/services/cellular_setup/ota_activator.cc +++ b/ash/services/cellular_setup/ota_activator.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/ota_activator.h" +#include "ash/services/cellular_setup/ota_activator.h" #include <utility>
diff --git a/chromeos/services/cellular_setup/ota_activator.h b/ash/services/cellular_setup/ota_activator.h similarity index 84% rename from chromeos/services/cellular_setup/ota_activator.h rename to ash/services/cellular_setup/ota_activator.h index 11f0d81c..dc0e1af 100644 --- a/chromeos/services/cellular_setup/ota_activator.h +++ b/ash/services/cellular_setup/ota_activator.h
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_H_ +#define ASH_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_H_ +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "base/callback.h" -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -44,4 +44,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_H_
diff --git a/chromeos/services/cellular_setup/ota_activator_impl.cc b/ash/services/cellular_setup/ota_activator_impl.cc similarity index 99% rename from chromeos/services/cellular_setup/ota_activator_impl.cc rename to ash/services/cellular_setup/ota_activator_impl.cc index 36ca457..0b19f9e0 100644 --- a/chromeos/services/cellular_setup/ota_activator_impl.cc +++ b/ash/services/cellular_setup/ota_activator_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/ota_activator_impl.h" +#include "ash/services/cellular_setup/ota_activator_impl.h" #include <sstream>
diff --git a/chromeos/services/cellular_setup/ota_activator_impl.h b/ash/services/cellular_setup/ota_activator_impl.h similarity index 94% rename from chromeos/services/cellular_setup/ota_activator_impl.h rename to ash/services/cellular_setup/ota_activator_impl.h index 1f67d1ccb..a9b7b85 100644 --- a/chromeos/services/cellular_setup/ota_activator_impl.h +++ b/ash/services/cellular_setup/ota_activator_impl.h
@@ -2,19 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_IMPL_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_IMPL_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_IMPL_H_ +#define ASH_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_IMPL_H_ #include <memory> #include <ostream> +#include "ash/services/cellular_setup/ota_activator.h" +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_task_runner_handle.h" #include "base/timer/timer.h" #include "chromeos/network/network_state_handler_observer.h" -#include "chromeos/services/cellular_setup/ota_activator.h" -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -149,4 +149,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_IMPL_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_OTA_ACTIVATOR_IMPL_H_
diff --git a/chromeos/services/cellular_setup/ota_activator_impl_unittest.cc b/ash/services/cellular_setup/ota_activator_impl_unittest.cc similarity index 98% rename from chromeos/services/cellular_setup/ota_activator_impl_unittest.cc rename to ash/services/cellular_setup/ota_activator_impl_unittest.cc index f8f0e3d..831774b 100644 --- a/chromeos/services/cellular_setup/ota_activator_impl_unittest.cc +++ b/ash/services/cellular_setup/ota_activator_impl_unittest.cc
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/ota_activator_impl.h" +#include "ash/services/cellular_setup/ota_activator_impl.h" #include <memory> #include <utility> +#include "ash/services/cellular_setup/public/cpp/fake_activation_delegate.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" @@ -16,7 +17,6 @@ #include "chromeos/network/network_connection_handler.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_test_helper.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h" #include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/service_constants.h"
diff --git a/chromeos/services/cellular_setup/public/cpp/BUILD.gn b/ash/services/cellular_setup/public/cpp/BUILD.gn similarity index 77% rename from chromeos/services/cellular_setup/public/cpp/BUILD.gn rename to ash/services/cellular_setup/public/cpp/BUILD.gn index 226791a..a617c26 100644 --- a/chromeos/services/cellular_setup/public/cpp/BUILD.gn +++ b/ash/services/cellular_setup/public/cpp/BUILD.gn
@@ -2,6 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash) + static_library("test_support") { testonly = true @@ -17,8 +21,8 @@ ] public_deps = [ - "//chromeos/services/cellular_setup", - "//chromeos/services/cellular_setup/public/mojom", + "//ash/services/cellular_setup", + "//ash/services/cellular_setup/public/mojom", ] deps = [ "//base" ]
diff --git a/chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.cc b/ash/services/cellular_setup/public/cpp/esim_manager_test_observer.cc similarity index 95% rename from chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.cc rename to ash/services/cellular_setup/public/cpp/esim_manager_test_observer.cc index 5087d12..5bd9a1a 100644 --- a/chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.cc +++ b/ash/services/cellular_setup/public/cpp/esim_manager_test_observer.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.h" +#include "ash/services/cellular_setup/public/cpp/esim_manager_test_observer.h" namespace chromeos { namespace cellular_setup { @@ -58,4 +58,4 @@ } } // namespace cellular_setup -} // namespace chromeos \ No newline at end of file +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.h b/ash/services/cellular_setup/public/cpp/esim_manager_test_observer.h similarity index 86% rename from chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.h rename to ash/services/cellular_setup/public/cpp/esim_manager_test_observer.h index bd32e8b..e080b8a7 100644 --- a/chromeos/services/cellular_setup/public/cpp/esim_manager_test_observer.h +++ b/ash/services/cellular_setup/public/cpp/esim_manager_test_observer.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_ESIM_MANAGER_TEST_OBSERVER_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_ESIM_MANAGER_TEST_OBSERVER_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_ESIM_MANAGER_TEST_OBSERVER_H_ +#define ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_ESIM_MANAGER_TEST_OBSERVER_H_ -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" namespace chromeos { @@ -64,4 +64,4 @@ } // namespace cellular_setup } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_ESIM_MANAGER_TEST_OBSERVER_H_ \ No newline at end of file +#endif // ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_ESIM_MANAGER_TEST_OBSERVER_H_
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.cc b/ash/services/cellular_setup/public/cpp/fake_activation_delegate.cc similarity index 92% rename from chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.cc rename to ash/services/cellular_setup/public/cpp/fake_activation_delegate.cc index 49b1ce1..662a699 100644 --- a/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.cc +++ b/ash/services/cellular_setup/public/cpp/fake_activation_delegate.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h" +#include "ash/services/cellular_setup/public/cpp/fake_activation_delegate.h" namespace chromeos {
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h b/ash/services/cellular_setup/public/cpp/fake_activation_delegate.h similarity index 81% rename from chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h rename to ash/services/cellular_setup/public/cpp/fake_activation_delegate.h index 5ed7514d..96b02e5 100644 --- a/chromeos/services/cellular_setup/public/cpp/fake_activation_delegate.h +++ b/ash/services/cellular_setup/public/cpp/fake_activation_delegate.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ +#define ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ #include <vector> -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -53,4 +53,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_ACTIVATION_DELEGATE_H_
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc b/ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc similarity index 90% rename from chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc rename to ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc index 3a17483..d36fc725 100644 --- a/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc +++ b/ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" +#include "ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" namespace chromeos {
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h b/ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h similarity index 78% rename from chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h rename to ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h index 3359b49a..5d4e8e81 100644 --- a/chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h +++ b/ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ +#define ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ #include <vector> -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -44,4 +44,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CARRIER_PORTAL_HANDLER_H_
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.cc b/ash/services/cellular_setup/public/cpp/fake_cellular_setup.cc similarity index 90% rename from chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.cc rename to ash/services/cellular_setup/public/cpp/fake_cellular_setup.cc index 02a4245..e05ad34 100644 --- a/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.cc +++ b/ash/services/cellular_setup/public/cpp/fake_cellular_setup.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h" +#include "ash/services/cellular_setup/public/cpp/fake_cellular_setup.h" -#include "chromeos/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" +#include "ash/services/cellular_setup/public/cpp/fake_carrier_portal_handler.h" #include <utility>
diff --git a/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h b/ash/services/cellular_setup/public/cpp/fake_cellular_setup.h similarity index 85% rename from chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h rename to ash/services/cellular_setup/public/cpp/fake_cellular_setup.h index 820023a..59495b0 100644 --- a/chromeos/services/cellular_setup/public/cpp/fake_cellular_setup.h +++ b/ash/services/cellular_setup/public/cpp/fake_cellular_setup.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ -#define CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ +#ifndef ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ +#define ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ #include <memory> #include <vector> -#include "chromeos/services/cellular_setup/cellular_setup_base.h" -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "ash/services/cellular_setup/cellular_setup_base.h" +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -77,4 +77,4 @@ } // namespace chromeos -#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_ +#endif // ASH_SERVICES_CELLULAR_SETUP_PUBLIC_CPP_FAKE_CELLULAR_SETUP_H_
diff --git a/chromeos/services/cellular_setup/public/mojom/BUILD.gn b/ash/services/cellular_setup/public/mojom/BUILD.gn similarity index 84% rename from chromeos/services/cellular_setup/public/mojom/BUILD.gn rename to ash/services/cellular_setup/public/mojom/BUILD.gn index ff06cdb0..c9802323 100644 --- a/chromeos/services/cellular_setup/public/mojom/BUILD.gn +++ b/ash/services/cellular_setup/public/mojom/BUILD.gn
@@ -2,8 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromeos/ui_mode.gni") import("//mojo/public/tools/bindings/mojom.gni") +assert(is_chromeos_ash) + mojom("mojom") { sources = [ "cellular_setup.mojom",
diff --git a/chromeos/services/cellular_setup/public/mojom/OWNERS b/ash/services/cellular_setup/public/mojom/OWNERS similarity index 100% rename from chromeos/services/cellular_setup/public/mojom/OWNERS rename to ash/services/cellular_setup/public/mojom/OWNERS
diff --git a/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom b/ash/services/cellular_setup/public/mojom/cellular_setup.mojom similarity index 100% rename from chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom rename to ash/services/cellular_setup/public/mojom/cellular_setup.mojom
diff --git a/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom b/ash/services/cellular_setup/public/mojom/esim_manager.mojom similarity index 100% rename from chromeos/services/cellular_setup/public/mojom/esim_manager.mojom rename to ash/services/cellular_setup/public/mojom/esim_manager.mojom
diff --git a/ash/shelf/login_shelf_view_unittest.cc b/ash/shelf/login_shelf_view_unittest.cc index 6422ec7..5688de0 100644 --- a/ash/shelf/login_shelf_view_unittest.cc +++ b/ash/shelf/login_shelf_view_unittest.cc
@@ -39,6 +39,7 @@ #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/run_loop.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "ui/display/manager/display_configurator.h" #include "ui/display/manager/test/action_logger.h" @@ -975,6 +976,13 @@ EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown})); } +namespace { + +const char kShelfShutdownConfirmationActionHistogramName[] = + "Ash.Shelf.ShutdownConfirmationBubble.Action"; + +} // namespace + class LoginShelfViewWithShutdownConfirmationTest : public LoginShelfViewTest { public: LoginShelfViewWithShutdownConfirmationTest() = default; @@ -988,10 +996,11 @@ void SetUp() override { LoginShelfViewTest::SetUp(); - base::test::ScopedFeatureList features( - features::kShutdownConfirmationBubble); + feature_list_.InitAndEnableFeature(features::kShutdownConfirmationBubble); } + base::HistogramTester& histograms() { return histograms_; } + protected: // Check whether the shutdown confirmation is visible. bool IsShutdownConfirmationVisible() { @@ -1028,14 +1037,32 @@ base::RunLoop().RunUntilIdle(); } + + // Dismiss shutdown confirmation bubble. + void DismissShutdown() { + // Focus shelf widget (which could happen if user tabs to login shelf + // buttons). + gfx::NativeWindow window = + login_shelf_view_->GetWidget()->GetNativeWindow(); + ShelfWidget* shelf_widget = Shelf::ForWindow(window)->shelf_widget(); + shelf_widget->set_default_last_focusable_child(/*reverse=*/false); + Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); + ExpectFocused(shelf_widget->GetContentsView()); + + base::RunLoop().RunUntilIdle(); + } + + private: + // Histogram value verifier. + base::HistogramTester histograms_; + + base::test::ScopedFeatureList feature_list_; }; // Checks that shutdown confirmation bubble appears after pressing the // shutdown button on the lockscreen TEST_F(LoginShelfViewWithShutdownConfirmationTest, ShouldShowAfterShutdownButtonLockSession) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); - CreateUserSessions(1); NotifySessionStateChanged(SessionState::LOCKED); EXPECT_TRUE( @@ -1045,14 +1072,17 @@ Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + + histograms().ExpectUniqueSample(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 1); } // Checks that shutdown confirmation bubble appears after pressing the // shutdown button on the lockscreen TEST_F(LoginShelfViewWithShutdownConfirmationTest, ShouldShowAfterShutdownButtonOobeSession) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); - login_shelf_view_->SetLoginDialogState(OobeDialogState::USER_CREATION); NotifySessionStateChanged(SessionState::OOBE); EXPECT_TRUE(ShowsShelfButtons( @@ -1062,14 +1092,17 @@ Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + + histograms().ExpectUniqueSample(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 1); } // Checks that shutdown confirmation bubble appears after pressing the // shutdown button on the lockscreen TEST_F(LoginShelfViewWithShutdownConfirmationTest, ShouldShowAfterShutdownButtonLoginPrimarySession) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); - login_shelf_view_->SetAllowLoginAsGuest(true /*allow_guest*/); NotifySessionStateChanged(SessionState::LOGIN_PRIMARY); EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown, @@ -1080,14 +1113,17 @@ Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + + histograms().ExpectUniqueSample(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 1); } // Checks that shutdown confirmation bubble disappears after pressing the // cancel button on the shutdown confirmation bubble and could be shown again. TEST_F(LoginShelfViewWithShutdownConfirmationTest, ShouldCloseAfterCancelButton) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); - CreateUserSessions(1); NotifySessionStateChanged(SessionState::LOCKED); EXPECT_TRUE( @@ -1097,16 +1133,29 @@ Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 1); // Shutdown confirmation is cancelled and disappeared. CancelShutdown(); EXPECT_FALSE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kCancelled, + 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 2); // Shutdown confirmation could be shown again. Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 2); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 3); } // Checks that shutdown confirmation bubble disappears after pressing the @@ -1114,8 +1163,6 @@ // down. TEST_F(LoginShelfViewWithShutdownConfirmationTest, ShouldCloseAndShutdownAfterConfirmButton) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); - CreateUserSessions(1); NotifySessionStateChanged(SessionState::LOCKED); EXPECT_TRUE( @@ -1125,17 +1172,24 @@ Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 1); // Shutdown confirmation is confirmed and disappeared. ConfirmShutdown(); EXPECT_FALSE(IsShutdownConfirmationVisible()); EXPECT_TRUE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kConfirmed, + 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 2); } // Checks that shutdown confirmation bubble disappears after inactive. TEST_F(LoginShelfViewWithShutdownConfirmationTest, ShouldCloseAfterInactive) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); - CreateUserSessions(1); NotifySessionStateChanged(SessionState::LOCKED); EXPECT_TRUE( @@ -1145,23 +1199,25 @@ Click(LoginShelfView::kShutdown); EXPECT_TRUE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kOpened, 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 1); - // Focus shelf widget (which could happen if user tabs to login shelf - // buttons). - gfx::NativeWindow window = login_shelf_view_->GetWidget()->GetNativeWindow(); - ShelfWidget* shelf_widget = Shelf::ForWindow(window)->shelf_widget(); - shelf_widget->set_default_last_focusable_child(/*reverse=*/false); - Shell::Get()->focus_cycler()->FocusWidget(shelf_widget); - ExpectFocused(shelf_widget->GetContentsView()); + DismissShutdown(); // Shutdown confirmation is inactive and disappeared. EXPECT_FALSE(IsShutdownConfirmationVisible()); EXPECT_FALSE(Shell::Get()->lock_state_controller()->ShutdownRequested()); + histograms().ExpectBucketCount(kShelfShutdownConfirmationActionHistogramName, + ShelfShutdownConfirmationBubble::kDismissed, + 1); + histograms().ExpectTotalCount(kShelfShutdownConfirmationActionHistogramName, + 2); } // When display is on Shutdown button clicks should not be blocked. TEST_F(LoginShelfViewWithShutdownConfirmationTest, DisplayOn) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); display::DisplayConfigurator* configurator = ash::Shell::Get()->display_configurator(); ASSERT_TRUE(configurator->IsDisplayOn()); @@ -1174,7 +1230,6 @@ // When display is off Shutdown button clicks should be blocked // `kMaxDroppedCallsWhenDisplaysOff` times. TEST_F(LoginShelfViewWithShutdownConfirmationTest, DisplayOff) { - base::test::ScopedFeatureList features(features::kShutdownConfirmationBubble); display::DisplayConfigurator* configurator = ash::Shell::Get()->display_configurator(); display::test::ActionLogger action_logger; @@ -1211,6 +1266,15 @@ } TEST_F(LoginShelfViewWithShutdownConfirmationTest, ClickRestartButton) { + CreateUserSessions(1); + NotifySessionStateChanged(SessionState::LOCKED); + EXPECT_TRUE( + ShowsShelfButtons({LoginShelfView::kShutdown, LoginShelfView::kSignOut})); + + NotifyShutdownPolicyChanged(true /*reboot_on_shutdown*/); + EXPECT_TRUE( + ShowsShelfButtons({LoginShelfView::kRestart, LoginShelfView::kSignOut})); + Click(LoginShelfView::kRestart); EXPECT_FALSE(IsShutdownConfirmationVisible()); EXPECT_TRUE(Shell::Get()->lock_state_controller()->ShutdownRequested());
diff --git a/ash/shelf/shelf_shutdown_confirmation_bubble.cc b/ash/shelf/shelf_shutdown_confirmation_bubble.cc index cfca30d..9e6fcf6 100644 --- a/ash/shelf/shelf_shutdown_confirmation_bubble.cc +++ b/ash/shelf/shelf_shutdown_confirmation_bubble.cc
@@ -72,6 +72,8 @@ layout_provider->GetInsetsMetric(views::INSETS_DIALOG); set_margins(kShutdownConfirmationBubbleInsets + dialog_insets); set_close_on_deactivate(true); + SetCloseCallback(base::BindOnce(&ShelfShutdownConfirmationBubble::OnClosed, + base::Unretained(this))); views::FlexLayout* layout = SetLayoutManager(std::make_unique<views::FlexLayout>()); @@ -144,10 +146,6 @@ } ShelfShutdownConfirmationBubble::~ShelfShutdownConfirmationBubble() { - if (cancel_callback_ && confirm_callback_) { - base::UmaHistogramEnumeration(kActionHistogramName, - ShelfShutdownConfirmationBubble::kDismissed); - } // In case shutdown confirmation bubble was dismissed, the pointer of the // ShelfShutdownConfirmationBubble in LoginShelfView shall be cleaned up. if (cancel_callback_) { @@ -175,21 +173,32 @@ } void ShelfShutdownConfirmationBubble::OnCancelled() { + dialog_result_ = DialogResult::kCancelled; GetWidget()->Close(); - - base::UmaHistogramEnumeration(kActionHistogramName, - ShelfShutdownConfirmationBubble::kCancelled); - - std::move(cancel_callback_).Run(); } void ShelfShutdownConfirmationBubble::OnConfirmed() { + dialog_result_ = DialogResult::kConfirmed; GetWidget()->Close(); +} - base::UmaHistogramEnumeration(kActionHistogramName, - ShelfShutdownConfirmationBubble::kConfirmed); - - std::move(confirm_callback_).Run(); +void ShelfShutdownConfirmationBubble::OnClosed() { + switch (dialog_result_) { + case DialogResult::kCancelled: + base::UmaHistogramEnumeration( + kActionHistogramName, ShelfShutdownConfirmationBubble::kCancelled); + std::move(cancel_callback_).Run(); + break; + case DialogResult::kConfirmed: + base::UmaHistogramEnumeration( + kActionHistogramName, ShelfShutdownConfirmationBubble::kConfirmed); + std::move(confirm_callback_).Run(); + break; + case DialogResult::kNone: + base::UmaHistogramEnumeration( + kActionHistogramName, ShelfShutdownConfirmationBubble::kDismissed); + break; + } } gfx::Size ShelfShutdownConfirmationBubble::CalculatePreferredSize() const {
diff --git a/ash/shelf/shelf_shutdown_confirmation_bubble.h b/ash/shelf/shelf_shutdown_confirmation_bubble.h index 08def6e..4667b7b 100644 --- a/ash/shelf/shelf_shutdown_confirmation_bubble.h +++ b/ash/shelf/shelf_shutdown_confirmation_bubble.h
@@ -69,6 +69,7 @@ // Callback functions of cancel and confirm buttons void OnCancelled(); void OnConfirmed(); + void OnClosed(); base::OnceClosure confirm_callback_; base::OnceClosure cancel_callback_; @@ -76,6 +77,11 @@ views::Label* title_ = nullptr; views::LabelButton* cancel_ = nullptr; views::LabelButton* confirm_ = nullptr; + + enum class DialogResult { kNone, kCancelled, kConfirmed }; + + // A simple state machine to keep track of the dialog result. + DialogResult dialog_result_{DialogResult::kNone}; }; } // namespace ash
diff --git a/ash/system/eche/eche_tray.cc b/ash/system/eche/eche_tray.cc index c1fda179..5d68aaa9 100644 --- a/ash/system/eche/eche_tray.cc +++ b/ash/system/eche/eche_tray.cc
@@ -25,6 +25,9 @@ #include "ui/compositor/layer.h" #include "ui/events/event.h" #include "ui/gfx/geometry/insets.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/image/image.h" +#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/border.h" #include "ui/views/controls/image_view.h" @@ -41,6 +44,8 @@ constexpr int kTrayIconCrossAxisInset = 0; constexpr int kIconColumnWidth = 16; +constexpr int kIconWidth = 22; +constexpr int kIconHeight = 22; constexpr gfx::Insets kBubblePadding(4, 4, kBubbleBottomPaddingDip, 4); @@ -85,7 +90,9 @@ void EcheTray::Initialize() { TrayBackgroundView::Initialize(); - UpdateVisibility(); + + // By default the icon is not visible until Eche notification is clicked on. + SetVisiblePreferred(false); } void EcheTray::CloseBubble() { @@ -162,6 +169,12 @@ url_ = url; } +void EcheTray::SetIcon(const gfx::Image& icon) { + icon_->SetImage(gfx::ImageSkiaOperations::CreateResizedImage( + icon.AsImageSkia(), skia::ImageOperations::RESIZE_BEST, + gfx::Size(kIconWidth, kIconHeight))); +} + void EcheTray::PurgeAndClose() { if (!bubble_) return; @@ -172,6 +185,7 @@ bubble_.reset(); SetIsActive(false); + SetVisiblePreferred(false); } void EcheTray::HideBubble() { @@ -221,10 +235,6 @@ bubble_->GetBubbleView()->UpdateBubble(); } -void EcheTray::UpdateVisibility() { - SetVisiblePreferred(true); -} - void EcheTray::OnArrowBackActivated() { // TODO(nayebi): implement this }
diff --git a/ash/system/eche/eche_tray.h b/ash/system/eche/eche_tray.h index 3151de0..2efca54 100644 --- a/ash/system/eche/eche_tray.h +++ b/ash/system/eche/eche_tray.h
@@ -25,6 +25,10 @@ class Event; } // namespace ui +namespace gfx { +class Image; +} // namespace gfx + namespace ash { class Shelf; @@ -69,6 +73,9 @@ // Setting a new value will cause the current bubble be destroyed. void SetUrl(const GURL& url); + // Sets the icon that will be used on the tray. + void SetIcon(const gfx::Image& icon); + // Destroys the view inclusing the web view. // Note: `CloseBubble` only hides the view. void PurgeAndClose(); @@ -84,10 +91,6 @@ TrayBubbleWrapper* get_bubble_wrapper_for_test() { return bubble_.get(); } private: - // Updates the visibility of the tray in the shelf based on the enable state - // of the `EcheCustomWidget` feature. - void UpdateVisibility(); - // Handles the click on the "back" arrow in the header. void OnArrowBackActivated();
diff --git a/ash/system/eche/eche_tray_unittest.cc b/ash/system/eche/eche_tray_unittest.cc index b4d6660..72fb867 100644 --- a/ash/system/eche/eche_tray_unittest.cc +++ b/ash/system/eche/eche_tray_unittest.cc
@@ -59,6 +59,12 @@ std::make_unique<TestAshWebViewFactory>(); }; +// Verify the Eche tray button exists and but is not visible initially. +TEST_F(EcheTrayTest, PaletteTrayIsInvisible) { + ASSERT_TRUE(eche_tray()); + EXPECT_FALSE(eche_tray()->GetVisible()); +} + // Verify taps on the eche tray button results in expected behaviour. // It also sets the url and calls `ShowBubble`. TEST_F(EcheTrayTest, EcheTrayShowBubbleAndTapTwice) { @@ -66,8 +72,10 @@ // is not shown initially. EXPECT_FALSE(eche_tray()->is_active()); EXPECT_FALSE(eche_tray()->get_bubble_wrapper_for_test()); + EXPECT_FALSE(eche_tray()->GetVisible()); eche_tray()->SetUrl(GURL("http://google.com")); + eche_tray()->SetVisiblePreferred(true); eche_tray()->ShowBubble(); EXPECT_TRUE(eche_tray()->is_active()); @@ -84,6 +92,7 @@ EXPECT_TRUE(eche_tray()->get_bubble_wrapper_for_test()); EXPECT_FALSE( eche_tray()->get_bubble_wrapper_for_test()->bubble_view()->GetVisible()); + EXPECT_TRUE(eche_tray()->GetVisible()); // Verify that tapping again will show the bubble. PerformTap(); @@ -93,6 +102,7 @@ EXPECT_TRUE(eche_tray()->get_bubble_wrapper_for_test()); EXPECT_TRUE( eche_tray()->get_bubble_wrapper_for_test()->bubble_view()->GetVisible()); + EXPECT_TRUE(eche_tray()->GetVisible()); } TEST_F(EcheTrayTest, EcheTrayCreatesBubbleButHideFirst) {
diff --git a/ash/system/network/cellular_setup_notifier.h b/ash/system/network/cellular_setup_notifier.h index 64955fa..0b2814a 100644 --- a/ash/system/network/cellular_setup_notifier.h +++ b/ash/system/network/cellular_setup_notifier.h
@@ -65,6 +65,7 @@ void OnDeviceStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} void MaybeShowCellularSetupNotification(); void OnTimerFired();
diff --git a/ash/system/network/tray_network_state_model.cc b/ash/system/network/tray_network_state_model.cc index 41e848c..0a1aabc 100644 --- a/ash/system/network/tray_network_state_model.cc +++ b/ash/system/network/tray_network_state_model.cc
@@ -125,6 +125,8 @@ void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} + TrayNetworkStateModel* model_; mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig> remote_cros_network_config_;
diff --git a/ash/system/phonehub/phone_hub_ui_controller.cc b/ash/system/phonehub/phone_hub_ui_controller.cc index 8ebd7083..02a8016 100644 --- a/ash/system/phonehub/phone_hub_ui_controller.cc +++ b/ash/system/phonehub/phone_hub_ui_controller.cc
@@ -11,8 +11,10 @@ #include "ash/components/phonehub/phone_hub_manager.h" #include "ash/components/phonehub/tether_controller.h" #include "ash/components/phonehub/user_action_recorder.h" +#include "ash/root_window_controller.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" +#include "ash/system/eche/eche_tray.h" #include "ash/system/phonehub/bluetooth_disabled_view.h" #include "ash/system/phonehub/onboarding_view.h" #include "ash/system/phonehub/phone_connected_view.h" @@ -20,6 +22,7 @@ #include "ash/system/phonehub/phone_disconnected_view.h" #include "ash/system/phonehub/phone_hub_content_view.h" #include "ash/system/phonehub/tether_connection_pending_view.h" +#include "ash/system/status_area_widget.h" #include "base/bind.h" #include "base/logging.h" #include "base/time/time.h" @@ -103,6 +106,15 @@ } void PhoneHubUiController::HandleBubbleOpened() { + // Make sure Eche window is not shown. + if (features::IsEcheCustomWidgetEnabled()) { + EcheTray* eche_tray = Shell::GetPrimaryRootWindowController() + ->GetStatusAreaWidget() + ->eche_tray(); + if (eche_tray) + eche_tray->CloseBubble(); + } + if (!phone_hub_manager_) return;
diff --git a/ash/system/phonehub/phone_hub_ui_controller_unittest.cc b/ash/system/phonehub/phone_hub_ui_controller_unittest.cc index 927fb62..be939d6 100644 --- a/ash/system/phonehub/phone_hub_ui_controller_unittest.cc +++ b/ash/system/phonehub/phone_hub_ui_controller_unittest.cc
@@ -7,8 +7,14 @@ #include "ash/components/phonehub/fake_phone_hub_manager.h" #include "ash/components/phonehub/fake_tether_controller.h" #include "ash/components/phonehub/phone_model_test_util.h" +#include "ash/shell.h" +#include "ash/system/eche/eche_tray.h" #include "ash/system/phonehub/phone_hub_view_ids.h" +#include "ash/system/status_area_widget_test_helper.h" +#include "ash/system/tray/tray_bubble_wrapper.h" #include "ash/test/ash_test_base.h" +#include "ash/test/test_ash_web_view_factory.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,6 +42,10 @@ // AshTestBase: void SetUp() override { + feature_list_.InitWithFeatures( + {chromeos::features::kEcheSWA, chromeos::features::kEcheCustomWidget}, + {}); + AshTestBase::SetUp(); // Create user 1 session and simulate its login. @@ -97,6 +107,13 @@ std::unique_ptr<PhoneHubUiController> controller_; phonehub::FakePhoneHubManager phone_hub_manager_; bool ui_state_changed_ = false; + + private: + base::test::ScopedFeatureList feature_list_; + + // Calling the factory constructor is enough to set it up. + std::unique_ptr<TestAshWebViewFactory> test_web_view_factory_ = + std::make_unique<TestAshWebViewFactory>(); }; TEST_F(PhoneHubUiControllerTest, NotEligibleForFeature) { @@ -306,4 +323,19 @@ EXPECT_EQ(PhoneHubViewID::kBluetoothDisabledView, content_view->GetID()); } +TEST_F(PhoneHubUiControllerTest, HandleBubbleOpenedShouldCloseEcheBubble) { + EcheTray* eche_tray = + StatusAreaWidgetTestHelper::GetStatusAreaWidget()->eche_tray(); + eche_tray->SetUrl(GURL("http://google.com")); + eche_tray->SetVisiblePreferred(true); + eche_tray->ShowBubble(); + EXPECT_TRUE( + eche_tray->get_bubble_wrapper_for_test()->bubble_view()->GetVisible()); + + controller_->HandleBubbleOpened(); + + EXPECT_FALSE( + eche_tray->get_bubble_wrapper_for_test()->bubble_view()->GetVisible()); +} + } // namespace ash
diff --git a/ash/webui/diagnostics_ui/backend/network_health_provider.cc b/ash/webui/diagnostics_ui/backend/network_health_provider.cc index e4ade11..0ef8756 100644 --- a/ash/webui/diagnostics_ui/backend/network_health_provider.cc +++ b/ash/webui/diagnostics_ui/backend/network_health_provider.cc
@@ -423,8 +423,6 @@ NotifyNetworkStateObserver(iter->second); } -void NetworkHealthProvider::OnNetworkStateListChanged() {} - void NetworkHealthProvider::OnDeviceStateListChanged() { GetDeviceState(); } @@ -439,9 +437,6 @@ UpdateMatchingNetwork(std::move(network), /*must_match_existing_guid=*/true); } -void NetworkHealthProvider::OnVpnProvidersChanged() {} -void NetworkHealthProvider::OnNetworkCertificatesChanged() {} - void NetworkHealthProvider::OnActiveNetworkStateListReceived( std::vector<network_mojom::NetworkStatePropertiesPtr> networks) { for (auto& network : networks) {
diff --git a/ash/webui/diagnostics_ui/backend/network_health_provider.h b/ash/webui/diagnostics_ui/backend/network_health_provider.h index 386dcac..ffcdf14 100644 --- a/ash/webui/diagnostics_ui/backend/network_health_provider.h +++ b/ash/webui/diagnostics_ui/backend/network_health_provider.h
@@ -60,7 +60,7 @@ bool ReceiverIsBound(); // CrosNetworkConfigObserver - void OnNetworkStateListChanged() override; + void OnNetworkStateListChanged() override {} void OnDeviceStateListChanged() override; void OnActiveNetworksChanged( std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr> @@ -68,8 +68,9 @@ void OnNetworkStateChanged( chromeos::network_config::mojom::NetworkStatePropertiesPtr network_state) override; - void OnVpnProvidersChanged() override; - void OnNetworkCertificatesChanged() override; + void OnVpnProvidersChanged() override {} + void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} // Returns the list of observer guids. Each guid corresponds to one network // interface. Additionally, updates the currently |active_guid_| to the first
diff --git a/ash/webui/eche_app_ui/eche_app_manager_unittest.cc b/ash/webui/eche_app_ui/eche_app_manager_unittest.cc index ddff94f..3294368 100644 --- a/ash/webui/eche_app_ui/eche_app_manager_unittest.cc +++ b/ash/webui/eche_app_ui/eche_app_manager_unittest.cc
@@ -27,6 +27,7 @@ #include "device/bluetooth/dbus/fake_bluetooth_debug_manager_client.h" #include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/image/image.h" namespace ash { namespace eche_app { @@ -37,7 +38,8 @@ void LaunchEcheAppFunction(const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) {} + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) {} void LaunchNotificationFunction( const absl::optional<std::u16string>& title,
diff --git a/ash/webui/eche_app_ui/eche_notification_click_handler.cc b/ash/webui/eche_app_ui/eche_notification_click_handler.cc index 2f8a4e9d..3f6324e 100644 --- a/ash/webui/eche_app_ui/eche_notification_click_handler.cc +++ b/ash/webui/eche_app_ui/eche_notification_click_handler.cc
@@ -56,7 +56,8 @@ case LaunchAppHelper::AppLaunchProhibitedReason::kNotProhibited: launch_app_helper_->LaunchEcheApp( notification_id, app_metadata.package_name, - app_metadata.visible_app_name, app_metadata.user_id); + app_metadata.visible_app_name, app_metadata.user_id, + app_metadata.icon); is_waiting_for_streaming_to_show_ = true; break; case LaunchAppHelper::AppLaunchProhibitedReason::kDisabledByScreenLock:
diff --git a/ash/webui/eche_app_ui/eche_notification_click_handler_unittest.cc b/ash/webui/eche_app_ui/eche_notification_click_handler_unittest.cc index 33be6b5..64fb496 100644 --- a/ash/webui/eche_app_ui/eche_notification_click_handler_unittest.cc +++ b/ash/webui/eche_app_ui/eche_notification_click_handler_unittest.cc
@@ -22,6 +22,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" namespace ash { namespace eche_app { @@ -79,7 +80,8 @@ void FakeLaunchEcheAppFunction(const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) { + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) { num_app_launch_++; }
diff --git a/ash/webui/eche_app_ui/eche_notification_generator_unittest.cc b/ash/webui/eche_app_ui/eche_notification_generator_unittest.cc index 63a8ccfe..b1526c28 100644 --- a/ash/webui/eche_app_ui/eche_notification_generator_unittest.cc +++ b/ash/webui/eche_app_ui/eche_notification_generator_unittest.cc
@@ -9,6 +9,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/gfx/image/image.h" namespace ash { namespace eche_app { @@ -70,7 +71,8 @@ void FakeLaunchEcheAppFunction(const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) { + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) { // Do nothing. }
diff --git a/ash/webui/eche_app_ui/eche_recent_app_click_handler.cc b/ash/webui/eche_app_ui/eche_recent_app_click_handler.cc index 42cca0e..6c770649 100644 --- a/ash/webui/eche_app_ui/eche_recent_app_click_handler.cc +++ b/ash/webui/eche_app_ui/eche_recent_app_click_handler.cc
@@ -72,7 +72,8 @@ case LaunchAppHelper::AppLaunchProhibitedReason::kNotProhibited: launch_app_helper_->LaunchEcheApp( /*notification_id=*/absl::nullopt, app_metadata.package_name, - app_metadata.visible_app_name, app_metadata.user_id); + app_metadata.visible_app_name, app_metadata.user_id, + app_metadata.icon); is_waiting_for_streaming_to_show_ = true; break; case LaunchAppHelper::AppLaunchProhibitedReason::kDisabledByScreenLock:
diff --git a/ash/webui/eche_app_ui/eche_recent_app_click_handler_unittest.cc b/ash/webui/eche_app_ui/eche_recent_app_click_handler_unittest.cc index 1f4f7d4..de272c8 100644 --- a/ash/webui/eche_app_ui/eche_recent_app_click_handler_unittest.cc +++ b/ash/webui/eche_app_ui/eche_recent_app_click_handler_unittest.cc
@@ -22,6 +22,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" namespace ash { namespace eche_app { @@ -80,7 +81,8 @@ void FakeLaunchEcheAppFunction(const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) { + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) { package_name_ = package_name; visible_name_ = visible_name; user_id_ = user_id.value();
diff --git a/ash/webui/eche_app_ui/launch_app_helper.cc b/ash/webui/eche_app_ui/launch_app_helper.cc index 73b758e..35f89663 100644 --- a/ash/webui/eche_app_ui/launch_app_helper.cc +++ b/ash/webui/eche_app_ui/launch_app_helper.cc
@@ -9,6 +9,7 @@ #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "base/check.h" +#include "ui/gfx/image/image.h" namespace ash { namespace eche_app { @@ -73,13 +74,13 @@ launch_notification_function_.Run(title, message, std::move(info)); } -void LaunchAppHelper::LaunchEcheApp( - absl::optional<int64_t> notification_id, - const std::string& package_name, - const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) const { +void LaunchAppHelper::LaunchEcheApp(absl::optional<int64_t> notification_id, + const std::string& package_name, + const std::u16string& visible_name, + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) const { launch_eche_app_function_.Run(notification_id, package_name, visible_name, - user_id); + user_id, icon); } void LaunchAppHelper::CloseEcheApp() const {
diff --git a/ash/webui/eche_app_ui/launch_app_helper.h b/ash/webui/eche_app_ui/launch_app_helper.h index 6a6ae50..1076c66e 100644 --- a/ash/webui/eche_app_ui/launch_app_helper.h +++ b/ash/webui/eche_app_ui/launch_app_helper.h
@@ -13,6 +13,10 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" +namespace gfx { +class Image; +} // namespace gfx + namespace ash { namespace eche_app { @@ -62,7 +66,8 @@ const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id)>; + const absl::optional<int64_t>& user_id, + const gfx::Image& icon)>; using CloseEcheAppFunction = base::RepeatingCallback<void()>; @@ -103,7 +108,8 @@ void LaunchEcheApp(absl::optional<int64_t> notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) const; + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) const; void CloseEcheApp() const;
diff --git a/ash/webui/eche_app_ui/launch_app_helper_unittest.cc b/ash/webui/eche_app_ui/launch_app_helper_unittest.cc index 89df310..6ac1f21 100644 --- a/ash/webui/eche_app_ui/launch_app_helper_unittest.cc +++ b/ash/webui/eche_app_ui/launch_app_helper_unittest.cc
@@ -17,6 +17,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image.h" namespace ash { namespace eche_app { @@ -27,7 +28,8 @@ void LaunchEcheAppFunction(const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) {} + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) {} void LaunchNotificationFunction( const absl::optional<std::u16string>& title,
diff --git a/ash/webui/eche_app_ui/system_info_provider.h b/ash/webui/eche_app_ui/system_info_provider.h index 50eadf2..5192b45 100644 --- a/ash/webui/eche_app_ui/system_info_provider.h +++ b/ash/webui/eche_app_ui/system_info_provider.h
@@ -71,6 +71,7 @@ void OnNetworkStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} void FetchWifiNetworkList(); void OnWifiNetworkList(
diff --git a/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html b/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html index 805a7db..f21755cf 100644 --- a/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html +++ b/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html
@@ -49,6 +49,17 @@ --iron-icon-width: 20px; --iron-icon-fill-color: var(--cros-link-color); } + .image-container iron-icon[icon='personalization:checkmark'] { + --iron-icon-height: 20px; + --iron-icon-width: 20px; + bottom: 0; + position: absolute; + right: 0; + } + .image-container:not([aria-selected='true']) + iron-icon[icon='personalization:checkmark'] { + display: none; + } </style> <div id="container"> <template is="dom-if" if="[[isCameraPresent_]]"> @@ -67,18 +78,22 @@ </iron-icon> </div> <template is="dom-if" if="[[profileImage_]]"> - <div class="image-container"> + <div class="image-container" + aria-selected$="[[getProfileImageAriaSelected_(profileImage_, image_)]]"> <paper-ripple class="circle"></paper-ripple> <img id="profileImage" src="[[profileImage_.url]]" on-click="onSelectProfileImage_" on-keypress="onSelectProfileImage_"> + <iron-icon icon="personalization:checkmark"></iron-icon> </div> </template> <template is="dom-repeat" items="[[defaultUserImages_]]"> - <div class="image-container"> + <div class="image-container" + aria-selected$="[[getDefaultUserImageAriaSelected_(item, image_)]]"> <paper-ripple class="circle"></paper-ripple> <img src="[[item.url.url]]" data-id$="[[item.index]]" on-click="onSelectDefaultImage_" on-keypress="onSelectDefaultImage_"> + <iron-icon icon="personalization:checkmark"></iron-icon> </div> </template> </div>
diff --git a/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.ts b/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.ts index beb0847e..1914762 100644 --- a/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.ts +++ b/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.ts
@@ -38,6 +38,8 @@ profileImage_: Object, + image_: Object, + /** The presence of a device camera. */ isCameraPresent_: { type: Boolean, @@ -57,6 +59,7 @@ private profileImage_: Url|null; private isCameraPresent_: boolean; private cameraMode_: AvatarCameraMode|null; + private image_: Url|null; connectedCallback() { super.connectedCallback(); @@ -66,6 +69,7 @@ 'profileImage_', state => state.user.profileImage); this.watch<AvatarList['isCameraPresent_']>( 'isCameraPresent_', state => state.user.isCameraPresent); + this.watch<AvatarList['image_']>('image_', state => state.user.image); this.updateFromStore(); fetchDefaultUserImages(getUserProvider(), this.getStore()); } @@ -84,6 +88,18 @@ getUserProvider().selectDefaultImage(index); } + private getProfileImageAriaSelected_( + profileImage: Url|null, selectedImage: Url|null): string { + return (!!profileImage && !!selectedImage && + selectedImage.url === profileImage.url) + .toString(); + } + + private getDefaultUserImageAriaSelected_( + image: DefaultUserImage, selectedImage: Url|null): string { + return (!!selectedImage && selectedImage.url === image.url.url).toString(); + } + private onSelectProfileImage_(event: Event) { if (!isSelectionEvent(event)) { return;
diff --git a/ash/webui/shimless_rma/backend/version_updater_unittest.cc b/ash/webui/shimless_rma/backend/version_updater_unittest.cc index df2b867..977a172 100644 --- a/ash/webui/shimless_rma/backend/version_updater_unittest.cc +++ b/ash/webui/shimless_rma/backend/version_updater_unittest.cc
@@ -58,11 +58,11 @@ base::RunLoop().RunUntilIdle(); version_updater_.reset(); NetworkHandler::Shutdown(); + cros_network_config_test_helper_.reset(); managed_network_configuration_handler_.reset(); network_configuration_handler_.reset(); network_profile_handler_.reset(); ui_proxy_config_service_.reset(); - cros_network_config_test_helper_.reset(); // This will delete `fake_update_engine_client_`. chromeos::DBusThreadManager::Shutdown(); }
diff --git a/ash/wm/client_controlled_state.cc b/ash/wm/client_controlled_state.cc index 3797b36..0bffa5a 100644 --- a/ash/wm/client_controlled_state.cc +++ b/ash/wm/client_controlled_state.cc
@@ -95,13 +95,16 @@ case WM_EVENT_MINIMIZE: case WM_EVENT_FULLSCREEN: case WM_EVENT_SNAP_PRIMARY: - case WM_EVENT_SNAP_SECONDARY: - case WM_EVENT_RESTORE: { + case WM_EVENT_SNAP_SECONDARY: { WindowStateType next_state = GetResolvedNextWindowStateType(window_state, event); UpdateWindowForTransitionEvents(window_state, next_state, event_type); break; } + case WM_EVENT_RESTORE: + UpdateWindowForTransitionEvents( + window_state, window_state->GetRestoreWindowState(), event_type); + break; case WM_EVENT_SHOW_INACTIVE: NOTREACHED(); break; @@ -297,20 +300,8 @@ const WindowStateType next = GetStateForTransitionEvent(window_state, event); if (Shell::Get()->tablet_mode_controller()->InTabletMode() && - next == WindowStateType::kNormal && window_state->CanMaximize()) { + next == WindowStateType::kNormal && window_state->CanMaximize()) return WindowStateType::kMaximized; - } - - // For app-requested fullscreen, don't allow it to restore back to kMaximized - // window state due to some restrictions on ARC++ side. see b/215710461 for - // details. This is a stopgap fix for M99. And we should revisit this behavior - // later and see if we can remove this restrictions. - const WMEventType type = event->type(); - if ((type == WM_EVENT_RESTORE || type == WM_EVENT_NORMAL) && - state_type_ == WindowStateType::kFullscreen && - next == WindowStateType::kMaximized) { - return WindowStateType::kNormal; - } return next; }
diff --git a/ash/wm/client_controlled_state_unittest.cc b/ash/wm/client_controlled_state_unittest.cc index c15bdec7..ec89ac5 100644 --- a/ash/wm/client_controlled_state_unittest.cc +++ b/ash/wm/client_controlled_state_unittest.cc
@@ -629,29 +629,4 @@ EXPECT_EQ(WindowStateType::kMaximized, delegate()->new_state()); } -// Tests the restore behavior for fullscreen window. For fullscreen window, for -// now it can only restore back to kNormal window state. Note: this behavior -// may change after M99, see b/215710461. -TEST_F(ClientControlledStateTest, FullscreenRestore) { - widget()->Maximize(); - EXPECT_FALSE(widget()->IsMaximized()); - state()->EnterNextState(window_state(), delegate()->new_state()); - EXPECT_TRUE(widget()->IsMaximized()); - - widget()->SetFullscreen(true); - EXPECT_TRUE(widget()->IsMaximized()); - EXPECT_EQ(WindowStateType::kMaximized, delegate()->old_state()); - EXPECT_EQ(WindowStateType::kFullscreen, delegate()->new_state()); - state()->EnterNextState(window_state(), delegate()->new_state()); - EXPECT_TRUE(widget()->IsFullscreen()); - - widget()->Restore(); - EXPECT_TRUE(widget()->IsFullscreen()); - EXPECT_EQ(WindowStateType::kFullscreen, delegate()->old_state()); - EXPECT_EQ(WindowStateType::kNormal, delegate()->new_state()); - state()->EnterNextState(window_state(), delegate()->new_state()); - EXPECT_FALSE(widget()->IsMaximized()); - EXPECT_FALSE(widget()->IsFullscreen()); -} - } // namespace ash
diff --git a/ash/wm/desks/templates/desks_templates_icon_container.cc b/ash/wm/desks/templates/desks_templates_icon_container.cc index c334ae3..4bdf472e 100644 --- a/ash/wm/desks/templates/desks_templates_icon_container.cc +++ b/ash/wm/desks/templates/desks_templates_icon_container.cc
@@ -222,7 +222,7 @@ break; } overflow_icon_view->UpdateCount(overflow_icon_view->count() + - num_hidden_icons); + num_hidden_icons + 1); } else if (overflow_icon_view->count() == 0) { // There is no overflow so hide the overflow icon view. overflow_icon_view->SetVisible(false);
diff --git a/ash/wm/desks/templates/desks_templates_icon_view.cc b/ash/wm/desks/templates/desks_templates_icon_view.cc index f41a985..3f25bd56 100644 --- a/ash/wm/desks/templates/desks_templates_icon_view.cc +++ b/ash/wm/desks/templates/desks_templates_icon_view.cc
@@ -63,11 +63,18 @@ icon_identifier_ = icon_identifier; count_ = count; + // The count to be displayed on the label. If `icon_identifier_` is empty, it + // is an overflow icon and should display the number of hidden icons. + // Otherwise, it should display `count_` - 1 to avoid overcounting the + // displayed icon. + const int visible_count = + count_ > 1 && !icon_identifier_.empty() ? count_ - 1 : count_; + if (count_ > 1 || icon_identifier_.empty()) { DCHECK(!count_label_); count_label_ = AddChildView( views::Builder<views::Label>() - .SetText(GetCountString(count_)) + .SetText(GetCountString(visible_count)) .SetBorder(views::CreateEmptyBorder(gfx::Insets( kCountLabelInsetSize, kCountLabelInsetSize, kCountLabelInsetSize,
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc index 93f36623d..e33cf18 100644 --- a/ash/wm/desks/templates/desks_templates_unittest.cc +++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -1117,17 +1117,73 @@ DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()}; EXPECT_FALSE(overflow_icon_view.icon_view()); EXPECT_TRUE(overflow_icon_view.count_label()); - EXPECT_EQ(u"+5", overflow_icon_view.count_label()->GetText()); + // We created (3 + 4) * 2 = 14 windows. The first 4 icon views are displayed, + // each with a "+1" count label, which leaves 14 - (4 * 2) = 6 windows. + EXPECT_EQ(u"+6", overflow_icon_view.count_label()->GetText()); EXPECT_TRUE(overflow_icon_view.desks_templates_icon_view()->GetVisible()); EXPECT_TRUE( item_view->Contains(overflow_icon_view.desks_templates_icon_view())); } +// Tests that apps with multiple window are counted correctly. +// _______________________________________________________________________________ +// | _________ _________ _________________ _________________ _________ +// | | | | | | | | | | | | | | | +// | | I | | I | | I + 1 | | I | + 1 | | + 3 | +// | | |_______| |_______| |_______|_______| |_______|_______| |_______| +// | +// |_____________________________________________________________________________| +// +TEST_F(DesksTemplatesTest, IconViewMultipleWindows) { + // Create a `DeskTemplate` that contains some apps with multiple windows and + // more than kMaxIcons windows. The grid should appear like the above diagram. + AddEntry(base::GUID::GenerateRandomV4(), "template_1", base::Time::Now(), + CreateRestoreData(std::vector<int>{1, 1, 2, 2, 3})); + + // Enter overview and show the Desks Templates Grid. + OpenOverviewAndShowTemplatesGrid(); + + // Get the icon views. + DesksTemplatesItemView* item_view = GetItemViewFromTemplatesGrid( + /*grid_item_index=*/0); + const std::vector<DesksTemplatesIconView*>& icon_views = + DesksTemplatesItemViewTestApi(item_view).GetIconViews(); + + // There should be 1 * 2 icon views for the 2 apps with 1 window, 2 * 2 icon + // views for the 2 apps with multiple windows, and 1 overflow icon view. + EXPECT_EQ(5u, icon_views.size()); + + // Verify each of the apps' count labels are correct. + DesksTemplatesIconViewTestApi icon_view_1(icon_views[0]); + EXPECT_TRUE(icon_view_1.icon_view()); + EXPECT_FALSE(icon_view_1.count_label()); + + DesksTemplatesIconViewTestApi icon_view_2(icon_views[1]); + EXPECT_TRUE(icon_view_2.icon_view()); + EXPECT_FALSE(icon_view_2.count_label()); + + DesksTemplatesIconViewTestApi icon_view_3(icon_views[2]); + EXPECT_TRUE(icon_view_3.icon_view()); + EXPECT_TRUE(icon_view_3.count_label()); + EXPECT_EQ(u"+1", icon_view_3.count_label()->GetText()); + + DesksTemplatesIconViewTestApi icon_view_4(icon_views[3]); + EXPECT_TRUE(icon_view_4.icon_view()); + EXPECT_TRUE(icon_view_4.count_label()); + EXPECT_EQ(u"+1", icon_view_4.count_label()->GetText()); + + // The overflow counter should display the number of excess apps. + DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()}; + EXPECT_FALSE(overflow_icon_view.icon_view()); + EXPECT_TRUE(overflow_icon_view.count_label()); + EXPECT_EQ(u"+3", overflow_icon_view.count_label()->GetText()); +} + // Tests that when an app has more than 9 windows, its label is changed to "9+". TEST_F(DesksTemplatesTest, IconViewMoreThan9Windows) { - // Create a `DeskTemplate` using which has 1 app with 10 windows. + // Create a `DeskTemplate` using which has 1 app with 11 windows. AddEntry(base::GUID::GenerateRandomV4(), "template_1", base::Time::Now(), - CreateRestoreData(std::vector<int>{10})); + CreateRestoreData(std::vector<int>{11})); // Enter overview and show the Desks Templates Grid. OpenOverviewAndShowTemplatesGrid(); @@ -2026,6 +2082,32 @@ CheckA11yOverrides("save", save_widget, desk_widget, focus_widget); } +// Tests that accessibility overrides are set as expected after entering +// templates view. +TEST_F(DesksTemplatesTest, AccessibilityFocusAnnotatorInViewingTemplate) { + auto window = CreateTestWindow(gfx::Rect(100, 100)); + + AddEntry(base::GUID::GenerateRandomV4(), "test_template", base::Time::Now()); + + OpenOverviewAndShowTemplatesGrid(); + + auto* focus_widget = views::Widget::GetWidgetForNativeWindow( + GetOverviewSession()->GetOverviewFocusWindow()); + DCHECK(focus_widget); + + OverviewGrid* overview_grid = GetOverviewGridList()[0].get(); + views::Widget* desk_widget = + const_cast<views::Widget*>(overview_grid->desks_widget()); + DCHECK(desk_widget); + views::Widget* template_widget = overview_grid->desks_templates_grid_widget(); + DCHECK(template_widget); + + // Order should be [focus_widget, template_widget, desk_widget]. + CheckA11yOverrides("focus", focus_widget, desk_widget, template_widget); + CheckA11yOverrides("template", template_widget, focus_widget, desk_widget); + CheckA11yOverrides("desk", desk_widget, template_widget, focus_widget); +} + TEST_F(DesksTemplatesTest, LayoutItemsInLandscape) { UpdateDisplay("800x600");
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc index de82f84..cb2027e 100644 --- a/ash/wm/overview/overview_session.cc +++ b/ash/wm/overview/overview_session.cc
@@ -1067,9 +1067,12 @@ // Note that this order matches the order of the tab cycling in // `OverviewHighlightController::GetTraversableViews`. for (auto& grid : grid_list_) { - for (const auto& item : grid->window_list()) - a11y_widgets.push_back(item->item_widget()); - + if (grid->IsShowingDesksTemplatesGrid()) { + a11y_widgets.push_back(grid->desks_templates_grid_widget()); + } else { + for (const auto& item : grid->window_list()) + a11y_widgets.push_back(item->item_widget()); + } if (grid->desks_widget()) a11y_widgets.push_back(const_cast<views::Widget*>(grid->desks_widget()));
diff --git a/base/allocator/allocator_interception_mac.mm b/base/allocator/allocator_interception_mac.mm index 3b9ab8c..57de35d 100644 --- a/base/allocator/allocator_interception_mac.mm +++ b/base/allocator/allocator_interception_mac.mm
@@ -237,7 +237,7 @@ bool CanGetContextForCFAllocator() { #if BUILDFLAG(IS_IOS) - return !base::ios::IsRunningOnOrLater(14, 0, 0); + return !base::ios::IsRunningOnOrLater(16, 0, 0); #else return !base::mac::IsOSLaterThan12_DontCallThis(); #endif
diff --git a/base/profiler/metadata_recorder.cc b/base/profiler/metadata_recorder.cc index d4c857f..c51728f 100644 --- a/base/profiler/metadata_recorder.cc +++ b/base/profiler/metadata_recorder.cc
@@ -13,8 +13,9 @@ MetadataRecorder::Item::Item(uint64_t name_hash, absl::optional<int64_t> key, + absl::optional<PlatformThreadId> thread_id, int64_t value) - : name_hash(name_hash), key(key), value(value) {} + : name_hash(name_hash), key(key), thread_id(thread_id), value(value) {} MetadataRecorder::Item::Item() : name_hash(0), value(0) {} @@ -37,6 +38,7 @@ void MetadataRecorder::Set(uint64_t name_hash, absl::optional<int64_t> key, + absl::optional<PlatformThreadId> thread_id, int64_t value) { AutoLock lock(write_lock_); @@ -49,7 +51,8 @@ size_t item_slots_used = item_slots_used_.load(std::memory_order_relaxed); for (size_t i = 0; i < item_slots_used; ++i) { auto& item = items_[i]; - if (item.name_hash == name_hash && item.key == key) { + if (item.name_hash == name_hash && item.key == key && + item.thread_id == thread_id) { item.value.store(value, std::memory_order_relaxed); const bool was_active = @@ -82,18 +85,22 @@ auto& item = items_[item_slots_used]; item.name_hash = name_hash; item.key = key; + item.thread_id = thread_id; item.value.store(value, std::memory_order_relaxed); item.is_active.store(true, std::memory_order_release); item_slots_used_.fetch_add(1, std::memory_order_release); } -void MetadataRecorder::Remove(uint64_t name_hash, absl::optional<int64_t> key) { +void MetadataRecorder::Remove(uint64_t name_hash, + absl::optional<int64_t> key, + absl::optional<PlatformThreadId> thread_id) { AutoLock lock(write_lock_); size_t item_slots_used = item_slots_used_.load(std::memory_order_relaxed); for (size_t i = 0; i < item_slots_used; ++i) { auto& item = items_[i]; - if (item.name_hash == name_hash && item.key == key) { + if (item.name_hash == name_hash && item.key == key && + item.thread_id == thread_id) { // A removed item will occupy its slot until that slot is reclaimed. const bool was_active = item.is_active.exchange(false, std::memory_order_relaxed); @@ -106,18 +113,21 @@ } MetadataRecorder::MetadataProvider::MetadataProvider( - MetadataRecorder* metadata_recorder) + MetadataRecorder* metadata_recorder, + PlatformThreadId thread_id) : metadata_recorder_(metadata_recorder), + thread_id_(thread_id), auto_lock_(metadata_recorder->read_lock_) {} MetadataRecorder::MetadataProvider::~MetadataProvider() = default; size_t MetadataRecorder::MetadataProvider::GetItems( ItemArray* const items) const { - return metadata_recorder_->GetItems(items); + return metadata_recorder_->GetItems(items, thread_id_); } -size_t MetadataRecorder::GetItems(ItemArray* const items) const { +size_t MetadataRecorder::GetItems(ItemArray* const items, + PlatformThreadId thread_id) const { // If a writer adds a new item after this load, it will be ignored. We do // this instead of calling item_slots_used_.load() explicitly in the for loop // bounds checking, which would be expensive. @@ -135,9 +145,11 @@ const auto& item = items_[read_index]; // Because we wait until |is_active| is set to consider an item active and // that field is always set last, we ignore half-created items. - if (item.is_active.load(std::memory_order_acquire)) { - (*items)[write_index++] = Item{ - item.name_hash, item.key, item.value.load(std::memory_order_relaxed)}; + if (item.is_active.load(std::memory_order_acquire) && + (!item.thread_id.has_value() || item.thread_id == thread_id)) { + (*items)[write_index++] = + Item{item.name_hash, item.key, item.thread_id, + item.value.load(std::memory_order_relaxed)}; } }
diff --git a/base/profiler/metadata_recorder.h b/base/profiler/metadata_recorder.h index b1b7c5a..50093b21ee 100644 --- a/base/profiler/metadata_recorder.h +++ b/base/profiler/metadata_recorder.h
@@ -12,6 +12,7 @@ #include "base/memory/raw_ptr.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" +#include "base/threading/platform_thread.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace base { @@ -129,7 +130,10 @@ MetadataRecorder& operator=(const MetadataRecorder&) = delete; struct BASE_EXPORT Item { - Item(uint64_t name_hash, absl::optional<int64_t> key, int64_t value); + Item(uint64_t name_hash, + absl::optional<int64_t> key, + absl::optional<PlatformThreadId> thread_id, + int64_t value); Item(); Item(const Item& other); @@ -139,20 +143,28 @@ uint64_t name_hash; // The key if specified when setting the item. absl::optional<int64_t> key; + // The thread_id is captured from the current thread for a thread-scoped + // item. + absl::optional<PlatformThreadId> thread_id; // The value of the metadata item. int64_t value; }; static constexpr size_t MAX_METADATA_COUNT = 50; typedef std::array<Item, MAX_METADATA_COUNT> ItemArray; - // Sets a value for a (|name_hash|, |key|) pair, overwriting any value - // previously set for the pair. Nullopt keys are treated as just another key - // state for the purpose of associating values. - void Set(uint64_t name_hash, absl::optional<int64_t> key, int64_t value); + // Sets a value for a (|name_hash|, |key|, |thread_id|) tuple, overwriting any + // value previously set for the tuple. Nullopt keys are treated as just + // another key state for the purpose of associating values. + void Set(uint64_t name_hash, + absl::optional<int64_t> key, + absl::optional<PlatformThreadId> thread_id, + int64_t value); // Removes the item with the specified name hash and optional key. Has no // effect if such an item does not exist. - void Remove(uint64_t name_hash, absl::optional<int64_t> key); + void Remove(uint64_t name_hash, + absl::optional<int64_t> key, + absl::optional<PlatformThreadId> thread_id); // An object that provides access to a MetadataRecorder's items and holds the // necessary exclusive read lock until the object is destroyed. Reclaiming of @@ -179,22 +191,25 @@ public: // Acquires an exclusive read lock on the metadata recorder which is held // until the object is destroyed. - explicit MetadataProvider(MetadataRecorder* metadata_recorder) + explicit MetadataProvider(MetadataRecorder* metadata_recorder, + PlatformThreadId thread_id) EXCLUSIVE_LOCK_FUNCTION(metadata_recorder_->read_lock_); ~MetadataProvider() UNLOCK_FUNCTION(); MetadataProvider(const MetadataProvider&) = delete; MetadataProvider& operator=(const MetadataProvider&) = delete; - // Retrieves the first |available_slots| items in the metadata recorder and - // copies them into |items|, returning the number of metadata items that - // were copied. To ensure that all items can be copied, |available slots| - // should be greater than or equal to |MAX_METADATA_COUNT|. Requires - // NO_THREAD_SAFETY_ANALYSIS because clang's analyzer doesn't understand the - // cross-class locking used in this class' implementation. + // Retrieves the first |available_slots| items in the metadata recorder for + // |thread_id| and copies them into |items|, returning the number of + // metadata items that were copied. To ensure that all items can be copied, + // |available slots| should be greater than or equal to + // |MAX_METADATA_COUNT|. Requires NO_THREAD_SAFETY_ANALYSIS because clang's + // analyzer doesn't understand the cross-class locking used in this class' + // implementation. size_t GetItems(ItemArray* const items) const NO_THREAD_SAFETY_ANALYSIS; private: const raw_ptr<const MetadataRecorder> metadata_recorder_; + PlatformThreadId thread_id_; base::AutoLock auto_lock_; }; @@ -212,14 +227,15 @@ // is marked as active. std::atomic<bool> is_active{false}; - // Neither name_hash or key require atomicity or memory order constraints - // because no reader will attempt to read them mid-write. Specifically, - // readers wait until |is_active| is true to read them. Because |is_active| - // is always stored with a memory_order_release fence, we're guaranteed that - // |name_hash| and |key| will be finished writing before |is_active| is set - // to true. + // Neither name_hash, key or thread_id require atomicity or memory order + // constraints because no reader will attempt to read them mid-write. + // Specifically, readers wait until |is_active| is true to read them. + // Because |is_active| is always stored with a memory_order_release fence, + // we're guaranteed that |name_hash|, |key| and |thread_id| will be finished + // writing before |is_active| is set to true. uint64_t name_hash; absl::optional<int64_t> key; + absl::optional<PlatformThreadId> thread_id; // Requires atomic reads and writes to avoid word tearing when updating an // existing item unsynchronized. Does not require acquire/release semantics @@ -240,7 +256,10 @@ EXCLUSIVE_LOCKS_REQUIRED(write_lock_) EXCLUSIVE_LOCKS_REQUIRED(read_lock_); - size_t GetItems(ItemArray* const items) const + // Retrieves items in the metadata recorder that are active for |thread_id| + // and copies them into |items|, returning the number of metadata items that + // were copied. + size_t GetItems(ItemArray* const items, PlatformThreadId thread_id) const EXCLUSIVE_LOCKS_REQUIRED(read_lock_); // Metadata items that the recorder has seen. Rather than implementing the
diff --git a/base/profiler/metadata_recorder_unittest.cc b/base/profiler/metadata_recorder_unittest.cc index 078736dd..82a4e90f 100644 --- a/base/profiler/metadata_recorder_unittest.cc +++ b/base/profiler/metadata_recorder_unittest.cc
@@ -27,49 +27,59 @@ MetadataRecorder recorder; MetadataRecorder::ItemArray items; - size_t item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); - - EXPECT_EQ(0u, item_count); + EXPECT_EQ(0u, MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items)); + EXPECT_EQ(0u, MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items)); } TEST(MetadataRecorderTest, Set_NewNameHash) { MetadataRecorder recorder; - recorder.Set(10, absl::nullopt, 20); + recorder.Set(10, absl::nullopt, absl::nullopt, 20); MetadataRecorder::ItemArray items; size_t item_count; { - item_count = MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + item_count = MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(1u, item_count); EXPECT_EQ(10u, items[0].name_hash); EXPECT_FALSE(items[0].key.has_value()); + EXPECT_FALSE(items[0].thread_id.has_value()); EXPECT_EQ(20, items[0].value); } - recorder.Set(20, absl::nullopt, 30); + recorder.Set(20, absl::nullopt, absl::nullopt, 30); { - item_count = MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + item_count = MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(2u, item_count); EXPECT_EQ(20u, items[1].name_hash); EXPECT_FALSE(items[1].key.has_value()); + EXPECT_FALSE(items[1].thread_id.has_value()); EXPECT_EQ(30, items[1].value); } } TEST(MetadataRecorderTest, Set_ExistingNameNash) { MetadataRecorder recorder; - recorder.Set(10, absl::nullopt, 20); - recorder.Set(10, absl::nullopt, 30); + recorder.Set(10, absl::nullopt, absl::nullopt, 20); + recorder.Set(10, absl::nullopt, absl::nullopt, 30); MetadataRecorder::ItemArray items; size_t item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(1u, item_count); EXPECT_EQ(10u, items[0].name_hash); EXPECT_FALSE(items[0].key.has_value()); + EXPECT_FALSE(items[0].thread_id.has_value()); EXPECT_EQ(30, items[0].value); } @@ -78,19 +88,20 @@ MetadataRecorder::ItemArray items; std::vector<MetadataRecorder::Item> expected; for (size_t i = 0; i < items.size(); ++i) { - expected.push_back(MetadataRecorder::Item{i, absl::nullopt, 0}); - recorder.Set(i, absl::nullopt, 0); + expected.emplace_back(i, absl::nullopt, absl::nullopt, 0); + recorder.Set(i, absl::nullopt, absl::nullopt, 0); } // By removing an item from a full recorder, re-setting the same item, and // verifying that the item is returned, we can verify that the recorder is // reusing the inactive slot for the same name hash instead of trying (and // failing) to allocate a new slot. - recorder.Remove(3, absl::nullopt); - recorder.Set(3, absl::nullopt, 0); + recorder.Remove(3, absl::nullopt, absl::nullopt); + recorder.Set(3, absl::nullopt, absl::nullopt, 0); size_t item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); EXPECT_EQ(items.size(), item_count); EXPECT_THAT(expected, ::testing::UnorderedElementsAreArray(items)); } @@ -99,22 +110,24 @@ MetadataRecorder recorder; MetadataRecorder::ItemArray items; for (size_t i = 0; i < items.size(); ++i) { - recorder.Set(i, absl::nullopt, 0); + recorder.Set(i, absl::nullopt, absl::nullopt, 0); } // This should fail silently. - recorder.Set(items.size(), absl::nullopt, 0); + recorder.Set(items.size(), absl::nullopt, absl::nullopt, 0); } TEST(MetadataRecorderTest, Set_NulloptKeyIsIndependentOfNonNulloptKey) { MetadataRecorder recorder; - recorder.Set(10, 100, 20); + recorder.Set(10, 100, absl::nullopt, 20); MetadataRecorder::ItemArray items; size_t item_count; { - item_count = MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + item_count = MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(1u, item_count); EXPECT_EQ(10u, items[0].name_hash); ASSERT_TRUE(items[0].key.has_value()); @@ -122,10 +135,12 @@ EXPECT_EQ(20, items[0].value); } - recorder.Set(10, absl::nullopt, 30); + recorder.Set(10, absl::nullopt, absl::nullopt, 30); { - item_count = MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + item_count = MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(2u, item_count); EXPECT_EQ(10u, items[0].name_hash); @@ -139,16 +154,65 @@ } } -TEST(MetadataRecorderTest, Remove) { +TEST(MetadataRecorderTest, Set_ThreadIdIsScoped) { MetadataRecorder recorder; - recorder.Set(10, absl::nullopt, 20); - recorder.Set(30, absl::nullopt, 40); - recorder.Set(50, absl::nullopt, 60); - recorder.Remove(30, absl::nullopt); + + recorder.Set(10, absl::nullopt, PlatformThread::CurrentId(), 20); + + MetadataRecorder::ItemArray items; + size_t item_count; + { + item_count = MetadataRecorder::MetadataProvider(&recorder, + PlatformThread::CurrentId()) + .GetItems(&items); + ASSERT_EQ(1u, item_count); + EXPECT_EQ(10u, items[0].name_hash); + EXPECT_FALSE(items[0].key.has_value()); + ASSERT_TRUE(items[0].thread_id.has_value()); + EXPECT_EQ(PlatformThread::CurrentId(), *items[0].thread_id); + EXPECT_EQ(20, items[0].value); + } + { + item_count = MetadataRecorder::MetadataProvider(&recorder, kInvalidThreadId) + .GetItems(&items); + EXPECT_EQ(0U, item_count); + } +} + +TEST(MetadataRecorderTest, Set_NulloptThreadAndNonNulloptThread) { + MetadataRecorder recorder; + + recorder.Set(10, absl::nullopt, PlatformThread::CurrentId(), 20); + recorder.Set(10, absl::nullopt, absl::nullopt, 30); MetadataRecorder::ItemArray items; size_t item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); + ASSERT_EQ(2u, item_count); + EXPECT_EQ(10u, items[0].name_hash); + EXPECT_FALSE(items[0].key.has_value()); + ASSERT_TRUE(items[0].thread_id.has_value()); + EXPECT_EQ(PlatformThread::CurrentId(), *items[0].thread_id); + EXPECT_EQ(20, items[0].value); + + EXPECT_EQ(10u, items[1].name_hash); + EXPECT_FALSE(items[1].key.has_value()); + EXPECT_FALSE(items[1].thread_id.has_value()); + EXPECT_EQ(30, items[1].value); +} + +TEST(MetadataRecorderTest, Remove) { + MetadataRecorder recorder; + recorder.Set(10, absl::nullopt, absl::nullopt, 20); + recorder.Set(30, absl::nullopt, absl::nullopt, 40); + recorder.Set(50, absl::nullopt, absl::nullopt, 60); + recorder.Remove(30, absl::nullopt, absl::nullopt); + + MetadataRecorder::ItemArray items; + size_t item_count = + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(2u, item_count); EXPECT_EQ(10u, items[0].name_hash); EXPECT_FALSE(items[0].key.has_value()); @@ -160,12 +224,13 @@ TEST(MetadataRecorderTest, Remove_DoesntExist) { MetadataRecorder recorder; - recorder.Set(10, absl::nullopt, 20); - recorder.Remove(20, absl::nullopt); + recorder.Set(10, absl::nullopt, absl::nullopt, 20); + recorder.Remove(20, absl::nullopt, absl::nullopt); MetadataRecorder::ItemArray items; size_t item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(1u, item_count); EXPECT_EQ(10u, items[0].name_hash); EXPECT_FALSE(items[0].key.has_value()); @@ -175,14 +240,15 @@ TEST(MetadataRecorderTest, Remove_NulloptKeyIsIndependentOfNonNulloptKey) { MetadataRecorder recorder; - recorder.Set(10, 100, 20); - recorder.Set(10, absl::nullopt, 30); + recorder.Set(10, 100, absl::nullopt, 20); + recorder.Set(10, absl::nullopt, absl::nullopt, 30); - recorder.Remove(10, absl::nullopt); + recorder.Remove(10, absl::nullopt, absl::nullopt); MetadataRecorder::ItemArray items; size_t item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&items); + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); ASSERT_EQ(1u, item_count); EXPECT_EQ(10u, items[0].name_hash); ASSERT_TRUE(items[0].key.has_value()); @@ -190,31 +256,52 @@ EXPECT_EQ(20, items[0].value); } +TEST(MetadataRecorderTest, + Remove_NulloptThreadIsIndependentOfNonNulloptThread) { + MetadataRecorder recorder; + + recorder.Set(10, absl::nullopt, PlatformThread::CurrentId(), 20); + recorder.Set(10, absl::nullopt, absl::nullopt, 30); + + recorder.Remove(10, absl::nullopt, absl::nullopt); + + MetadataRecorder::ItemArray items; + size_t item_count = + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&items); + ASSERT_EQ(1u, item_count); + EXPECT_EQ(10u, items[0].name_hash); + EXPECT_FALSE(items[0].key.has_value()); + ASSERT_TRUE(items[0].thread_id.has_value()); + EXPECT_EQ(PlatformThread::CurrentId(), *items[0].thread_id); + EXPECT_EQ(20, items[0].value); +} + TEST(MetadataRecorderTest, ReclaimInactiveSlots) { MetadataRecorder recorder; std::set<MetadataRecorder::Item> items_set; // Fill up the metadata map. for (size_t i = 0; i < MetadataRecorder::MAX_METADATA_COUNT; ++i) { - recorder.Set(i, absl::nullopt, i); - items_set.insert( - MetadataRecorder::Item{i, absl::nullopt, static_cast<int64_t>(i)}); + recorder.Set(i, absl::nullopt, absl::nullopt, i); + items_set.insert(MetadataRecorder::Item{i, absl::nullopt, absl::nullopt, + static_cast<int64_t>(i)}); } // Remove every fourth entry to fragment the data. size_t entries_removed = 0; for (size_t i = 3; i < MetadataRecorder::MAX_METADATA_COUNT; i += 4) { - recorder.Remove(i, absl::nullopt); + recorder.Remove(i, absl::nullopt, absl::nullopt); ++entries_removed; - items_set.erase( - MetadataRecorder::Item{i, absl::nullopt, static_cast<int64_t>(i)}); + items_set.erase(MetadataRecorder::Item{i, absl::nullopt, absl::nullopt, + static_cast<int64_t>(i)}); } // Ensure that the inactive slots are reclaimed to make room for more entries. for (size_t i = 1; i <= entries_removed; ++i) { - recorder.Set(i * 100, absl::nullopt, i * 100); - items_set.insert(MetadataRecorder::Item{i * 100, absl::nullopt, - static_cast<int64_t>(i * 100)}); + recorder.Set(i * 100, absl::nullopt, absl::nullopt, i * 100); + items_set.insert(MetadataRecorder::Item{ + i * 100, absl::nullopt, absl::nullopt, static_cast<int64_t>(i * 100)}); } MetadataRecorder::ItemArray items_arr; @@ -222,7 +309,8 @@ MetadataRecorder::ItemArray recorder_items; size_t recorder_item_count = - MetadataRecorder::MetadataProvider(&recorder).GetItems(&recorder_items); + MetadataRecorder::MetadataProvider(&recorder, PlatformThread::CurrentId()) + .GetItems(&recorder_items); EXPECT_EQ(recorder_item_count, MetadataRecorder::MAX_METADATA_COUNT); EXPECT_THAT(recorder_items, ::testing::UnorderedElementsAreArray(items_arr)); } @@ -232,7 +320,7 @@ HistogramTester histogram_tester; for (size_t i = 0; i < MetadataRecorder::MAX_METADATA_COUNT; ++i) { - recorder.Set(i * 10, absl::nullopt, i * 100); + recorder.Set(i * 10, absl::nullopt, absl::nullopt, i * 100); } EXPECT_THAT(
diff --git a/base/profiler/sample_metadata.cc b/base/profiler/sample_metadata.cc index 070ee6c..6685a103 100644 --- a/base/profiler/sample_metadata.cc +++ b/base/profiler/sample_metadata.cc
@@ -7,71 +7,100 @@ #include "base/metrics/metrics_hashes.h" #include "base/no_destructor.h" #include "base/profiler/stack_sampling_profiler.h" +#include "base/threading/thread_local.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace base { -SampleMetadata::SampleMetadata(StringPiece name) - : name_hash_(HashMetricName(name)) {} +namespace { + +absl::optional<PlatformThreadId> GetPlatformThreadIdForScope( + SampleMetadataScope scope) { + if (scope == SampleMetadataScope::kProcess) + return absl::nullopt; + return PlatformThread::CurrentId(); +} + +} // namespace + +SampleMetadata::SampleMetadata(StringPiece name, SampleMetadataScope scope) + : name_hash_(HashMetricName(name)), scope_(scope) {} void SampleMetadata::Set(int64_t value) { - GetSampleMetadataRecorder()->Set(name_hash_, absl::nullopt, value); + GetSampleMetadataRecorder()->Set(name_hash_, absl::nullopt, + GetPlatformThreadIdForScope(scope_), value); } void SampleMetadata::Set(int64_t key, int64_t value) { - GetSampleMetadataRecorder()->Set(name_hash_, key, value); + GetSampleMetadataRecorder()->Set(name_hash_, key, + GetPlatformThreadIdForScope(scope_), value); } void SampleMetadata::Remove() { - GetSampleMetadataRecorder()->Remove(name_hash_, absl::nullopt); + GetSampleMetadataRecorder()->Remove(name_hash_, absl::nullopt, + GetPlatformThreadIdForScope(scope_)); } void SampleMetadata::Remove(int64_t key) { - GetSampleMetadataRecorder()->Remove(name_hash_, key); + GetSampleMetadataRecorder()->Remove(name_hash_, key, + GetPlatformThreadIdForScope(scope_)); } -ScopedSampleMetadata::ScopedSampleMetadata(StringPiece name, int64_t value) - : name_hash_(HashMetricName(name)) { - GetSampleMetadataRecorder()->Set(name_hash_, absl::nullopt, value); +ScopedSampleMetadata::ScopedSampleMetadata(StringPiece name, + int64_t value, + SampleMetadataScope scope) + : name_hash_(HashMetricName(name)), + thread_id_(GetPlatformThreadIdForScope(scope)) { + GetSampleMetadataRecorder()->Set(name_hash_, absl::nullopt, thread_id_, + value); } ScopedSampleMetadata::ScopedSampleMetadata(StringPiece name, int64_t key, - int64_t value) - : name_hash_(HashMetricName(name)), key_(key) { - GetSampleMetadataRecorder()->Set(name_hash_, key, value); + int64_t value, + SampleMetadataScope scope) + : name_hash_(HashMetricName(name)), + key_(key), + thread_id_(GetPlatformThreadIdForScope(scope)) { + GetSampleMetadataRecorder()->Set(name_hash_, key, thread_id_, value); } ScopedSampleMetadata::~ScopedSampleMetadata() { - GetSampleMetadataRecorder()->Remove(name_hash_, key_); + GetSampleMetadataRecorder()->Remove(name_hash_, key_, thread_id_); } // This function is friended by StackSamplingProfiler so must live directly in // the base namespace. -void ApplyMetadataToPastSamplesImpl(TimeTicks period_start, - TimeTicks period_end, - int64_t name_hash, - absl::optional<int64_t> key, - int64_t value) { - StackSamplingProfiler::ApplyMetadataToPastSamples(period_start, period_end, - name_hash, key, value); +void ApplyMetadataToPastSamplesImpl( + TimeTicks period_start, + TimeTicks period_end, + int64_t name_hash, + absl::optional<int64_t> key, + int64_t value, + absl::optional<PlatformThreadId> thread_id) { + StackSamplingProfiler::ApplyMetadataToPastSamples( + period_start, period_end, name_hash, key, value, thread_id); } void ApplyMetadataToPastSamples(TimeTicks period_start, TimeTicks period_end, StringPiece name, - int64_t value) { + int64_t value, + SampleMetadataScope scope) { return ApplyMetadataToPastSamplesImpl( - period_start, period_end, HashMetricName(name), absl::nullopt, value); + period_start, period_end, HashMetricName(name), absl::nullopt, value, + GetPlatformThreadIdForScope(scope)); } void ApplyMetadataToPastSamples(TimeTicks period_start, TimeTicks period_end, StringPiece name, int64_t key, - int64_t value) { + int64_t value, + SampleMetadataScope scope) { return ApplyMetadataToPastSamplesImpl(period_start, period_end, - HashMetricName(name), key, value); + HashMetricName(name), key, value, + GetPlatformThreadIdForScope(scope)); } MetadataRecorder* GetSampleMetadataRecorder() {
diff --git a/base/profiler/sample_metadata.h b/base/profiler/sample_metadata.h index 57a6db4..38788e6 100644 --- a/base/profiler/sample_metadata.h +++ b/base/profiler/sample_metadata.h
@@ -7,6 +7,7 @@ #include "base/profiler/metadata_recorder.h" #include "base/strings/string_piece.h" +#include "base/threading/platform_thread.h" #include "third_party/abseil-cpp/absl/types/optional.h" // ----------------------------------------------------------------------------- @@ -15,8 +16,8 @@ // // Overview: // These functions provide a means to control the metadata attached to samples -// collected by the stack sampling profiler. Metadata state is shared between -// all threads within a process. +// collected by the stack sampling profiler. SampleMetadataScope controls the +// scope covered by the metadata (thread, process). // // Any samples collected by the sampling profiler will include the active // metadata. This enables us to later analyze targeted subsets of samples @@ -55,10 +56,20 @@ class TimeTicks; +enum class SampleMetadataScope { + // All threads in the current process will have the associated metadata + // attached to their samples. + kProcess, + // The metadata will only be attached to samples for the current thread. + kThread +}; + class BASE_EXPORT SampleMetadata { public: - // Set the metadata value associated with |name|. - explicit SampleMetadata(StringPiece name); + // Set the metadata value associated with |name| to be recorded for |scope|. + explicit SampleMetadata( + StringPiece name, + SampleMetadataScope scope = SampleMetadataScope::kProcess); SampleMetadata(const SampleMetadata&) = default; ~SampleMetadata() = default; @@ -96,21 +107,32 @@ private: const uint64_t name_hash_; + // Scope is kept as-is instead of retrieving a PlatformThreadId in case + // Set()/Remove() is called on a thread different from where the object was + // constructed. + const SampleMetadataScope scope_; }; class BASE_EXPORT ScopedSampleMetadata { public: - // Set the metadata value associated with |name|. - ScopedSampleMetadata(StringPiece name, int64_t value); + // Set the metadata value associated with |name| for |scope|. + ScopedSampleMetadata( + StringPiece name, + int64_t value, + SampleMetadataScope scope = SampleMetadataScope::kProcess); - // Set the metadata value associated with the pair (|name|, |key|). This - // constructor allows the metadata to be associated with an additional - // user-defined key. One might supply a key based on the frame id, for - // example, to distinguish execution in service of scrolling between different - // frames. Prefer the previous constructor if no user-defined metadata is - // required. Note: values specified for a name and key are stored separately - // from values specified with only a name. - ScopedSampleMetadata(StringPiece name, int64_t key, int64_t value); + // Set the metadata value associated with the pair (|name|, |key|) for + // |scope|. This constructor allows the metadata to be associated with an + // additional user-defined key. One might supply a key based on the frame id, + // for example, to distinguish execution in service of scrolling between + // different frames. Prefer the previous constructor if no user-defined + // metadata is required. Note: values specified for a name and key are stored + // separately from values specified with only a name. + ScopedSampleMetadata( + StringPiece name, + int64_t key, + int64_t value, + SampleMetadataScope scope = SampleMetadataScope::kProcess); ScopedSampleMetadata(const ScopedSampleMetadata&) = delete; ~ScopedSampleMetadata(); @@ -120,6 +142,7 @@ private: const uint64_t name_hash_; absl::optional<int64_t> key_; + absl::optional<PlatformThreadId> thread_id_; }; // Applies the specified metadata to samples already recorded between @@ -131,15 +154,19 @@ // metadata scope (i.e. because the start or end of execution was missed), at // the cost of missing execution that are longer than the profiling period, or // extend before or after it. |period_end| must be <= TimeTicks::Now(). -BASE_EXPORT void ApplyMetadataToPastSamples(TimeTicks period_start, - TimeTicks period_end, - StringPiece name, - int64_t value); -BASE_EXPORT void ApplyMetadataToPastSamples(TimeTicks period_start, - TimeTicks period_end, - StringPiece name, - int64_t key, - int64_t value); +BASE_EXPORT void ApplyMetadataToPastSamples( + TimeTicks period_start, + TimeTicks period_end, + StringPiece name, + int64_t value, + SampleMetadataScope scope = SampleMetadataScope::kProcess); +BASE_EXPORT void ApplyMetadataToPastSamples( + TimeTicks period_start, + TimeTicks period_end, + StringPiece name, + int64_t key, + int64_t value, + SampleMetadataScope scope = SampleMetadataScope::kProcess); // Returns the process-global metadata recorder instance used for tracking // sampling profiler metadata.
diff --git a/base/profiler/sample_metadata_unittest.cc b/base/profiler/sample_metadata_unittest.cc index 7c76ce4e..36efb79 100644 --- a/base/profiler/sample_metadata_unittest.cc +++ b/base/profiler/sample_metadata_unittest.cc
@@ -5,77 +5,87 @@ #include "base/profiler/sample_metadata.h" #include "base/metrics/metrics_hashes.h" +#include "base/threading/platform_thread.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { TEST(SampleMetadataTest, ScopedSampleMetadata) { MetadataRecorder::ItemArray items; - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); { ScopedSampleMetadata m("myname", 100); - ASSERT_EQ(1u, - MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) - .GetItems(&items)); + ASSERT_EQ(1u, MetadataRecorder::MetadataProvider( + GetSampleMetadataRecorder(), PlatformThread::CurrentId()) + .GetItems(&items)); EXPECT_EQ(HashMetricName("myname"), items[0].name_hash); EXPECT_FALSE(items[0].key.has_value()); EXPECT_EQ(100, items[0].value); } - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); } TEST(SampleMetadataTest, ScopedSampleMetadataWithKey) { MetadataRecorder::ItemArray items; - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); { ScopedSampleMetadata m("myname", 10, 100); - ASSERT_EQ(1u, - MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) - .GetItems(&items)); + ASSERT_EQ(1u, MetadataRecorder::MetadataProvider( + GetSampleMetadataRecorder(), PlatformThread::CurrentId()) + .GetItems(&items)); EXPECT_EQ(HashMetricName("myname"), items[0].name_hash); ASSERT_TRUE(items[0].key.has_value()); EXPECT_EQ(10, *items[0].key); EXPECT_EQ(100, items[0].value); } - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); } TEST(SampleMetadataTest, SampleMetadata) { MetadataRecorder::ItemArray items; - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); SampleMetadata metadata("myname"); metadata.Set(100); - ASSERT_EQ(1u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(1u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); EXPECT_EQ(HashMetricName("myname"), items[0].name_hash); EXPECT_FALSE(items[0].key.has_value()); EXPECT_EQ(100, items[0].value); metadata.Remove(); - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); } TEST(SampleMetadataTest, SampleMetadataWithKey) { MetadataRecorder::ItemArray items; - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); SampleMetadata metadata("myname"); metadata.Set(10, 100); - ASSERT_EQ(1u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(1u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); EXPECT_EQ(HashMetricName("myname"), items[0].name_hash); ASSERT_TRUE(items[0].key.has_value()); @@ -83,7 +93,32 @@ EXPECT_EQ(100, items[0].value); metadata.Remove(10); - ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder()) + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) + .GetItems(&items)); +} + +TEST(SampleMetadataTest, SampleMetadataWithThreadId) { + MetadataRecorder::ItemArray items; + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) + .GetItems(&items)); + + SampleMetadata metadata("myname", SampleMetadataScope::kThread); + metadata.Set(100); + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + kInvalidThreadId) + .GetItems(&items)); + ASSERT_EQ(1u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) + .GetItems(&items)); + EXPECT_EQ(HashMetricName("myname"), items[0].name_hash); + EXPECT_FALSE(items[0].key.has_value()); + EXPECT_EQ(100, items[0].value); + + metadata.Remove(); + ASSERT_EQ(0u, MetadataRecorder::MetadataProvider(GetSampleMetadataRecorder(), + PlatformThread::CurrentId()) .GetItems(&items)); }
diff --git a/base/profiler/stack_sampler.h b/base/profiler/stack_sampler.h index 54d8ab2..4dca2e8 100644 --- a/base/profiler/stack_sampler.h +++ b/base/profiler/stack_sampler.h
@@ -67,7 +67,8 @@ // Records a set of frames and returns them. virtual void RecordStackFrames(StackBuffer* stackbuffer, - ProfileBuilder* profile_builder) = 0; + ProfileBuilder* profile_builder, + PlatformThreadId thread_id) = 0; protected: StackSampler();
diff --git a/base/profiler/stack_sampler_impl.cc b/base/profiler/stack_sampler_impl.cc index 4dcdf75..72bb2d1 100644 --- a/base/profiler/stack_sampler_impl.cc +++ b/base/profiler/stack_sampler_impl.cc
@@ -108,7 +108,8 @@ } void StackSamplerImpl::RecordStackFrames(StackBuffer* stack_buffer, - ProfileBuilder* profile_builder) { + ProfileBuilder* profile_builder, + PlatformThreadId thread_id) { DCHECK(stack_buffer); if (record_sample_callback_) @@ -123,7 +124,7 @@ // Make this scope as small as possible because |metadata_provider| is // holding a lock. MetadataRecorder::MetadataProvider metadata_provider( - GetSampleMetadataRecorder()); + GetSampleMetadataRecorder(), thread_id); StackCopierDelegate delegate(&unwinders_, profile_builder, &metadata_provider); copy_stack_succeeded = stack_copier_->CopyStack(
diff --git a/base/profiler/stack_sampler_impl.h b/base/profiler/stack_sampler_impl.h index 7894d98..6bdf89f9 100644 --- a/base/profiler/stack_sampler_impl.h +++ b/base/profiler/stack_sampler_impl.h
@@ -39,7 +39,8 @@ void Initialize() override; void AddAuxUnwinder(std::unique_ptr<Unwinder> unwinder) override; void RecordStackFrames(StackBuffer* stack_buffer, - ProfileBuilder* profile_builder) override; + ProfileBuilder* profile_builder, + PlatformThreadId thread_id) override; // Exposes the internal function for unit testing. static std::vector<Frame> WalkStackForTesting(
diff --git a/base/profiler/stack_sampler_impl_unittest.cc b/base/profiler/stack_sampler_impl_unittest.cc index 19c83965..ad8bae3 100644 --- a/base/profiler/stack_sampler_impl_unittest.cc +++ b/base/profiler/stack_sampler_impl_unittest.cc
@@ -294,7 +294,8 @@ std::unique_ptr<StackBuffer> stack_buffer = std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t)); TestProfileBuilder profile_builder(&module_cache); - stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder); + stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder, + PlatformThread::CurrentId()); EXPECT_EQ(stack, stack_copy); } @@ -316,7 +317,8 @@ std::unique_ptr<StackBuffer> stack_buffer = std::make_unique<StackBuffer>(stack.size() * sizeof(uintptr_t)); TestProfileBuilder profile_builder(&module_cache); - stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder); + stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder, + PlatformThread::CurrentId()); EXPECT_EQ(timestamp, profile_builder.last_timestamp()); } @@ -333,7 +335,8 @@ stack_sampler_impl.Initialize(); - stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder); + stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder, + PlatformThread::CurrentId()); EXPECT_TRUE(unwinder->on_stack_capture_was_invoked()); EXPECT_TRUE(unwinder->update_modules_was_invoked()); @@ -354,7 +357,8 @@ CallRecordingUnwinder* aux_unwinder = owned_aux_unwinder.get(); stack_sampler_impl.AddAuxUnwinder(std::move(owned_aux_unwinder)); - stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder); + stack_sampler_impl.RecordStackFrames(stack_buffer.get(), &profile_builder, + PlatformThread::CurrentId()); EXPECT_TRUE(aux_unwinder->on_stack_capture_was_invoked()); EXPECT_TRUE(aux_unwinder->update_modules_was_invoked());
diff --git a/base/profiler/stack_sampling_profiler.cc b/base/profiler/stack_sampling_profiler.cc index dc3a13d..2eec075 100644 --- a/base/profiler/stack_sampling_profiler.cc +++ b/base/profiler/stack_sampling_profiler.cc
@@ -120,11 +120,13 @@ }; struct CollectionContext { - CollectionContext(const SamplingParams& params, + CollectionContext(PlatformThreadId thread_id, + const SamplingParams& params, WaitableEvent* finished, std::unique_ptr<StackSampler> sampler, std::unique_ptr<ProfileBuilder> profile_builder) : collection_id(next_collection_id.GetNext()), + thread_id(thread_id), params(params), finished(finished), profile_builder(std::move(profile_builder)), @@ -134,6 +136,7 @@ // An identifier for this collection, used to uniquely identify the // collection to outside interests. const int collection_id; + const PlatformThreadId thread_id; // Thread id of the sampled thread. const SamplingParams params; // Information about how to sample. const raw_ptr<WaitableEvent> @@ -178,7 +181,8 @@ base::TimeTicks period_end, int64_t name_hash, absl::optional<int64_t> key, - int64_t value); + int64_t value, + absl::optional<PlatformThreadId> thread_id); // Removes an active collection based on its collection id, forcing it to run // its callback if any data has been collected. This can be called externally @@ -231,11 +235,13 @@ void AddCollectionTask(std::unique_ptr<CollectionContext> collection); void AddAuxUnwinderTask(int collection_id, std::unique_ptr<Unwinder> unwinder); - void ApplyMetadataToPastSamplesTask(base::TimeTicks period_start, - base::TimeTicks period_end, - int64_t name_hash, - absl::optional<int64_t> key, - int64_t value); + void ApplyMetadataToPastSamplesTask( + base::TimeTicks period_start, + base::TimeTicks period_end, + int64_t name_hash, + absl::optional<int64_t> key, + int64_t value, + absl::optional<PlatformThreadId> thread_id); void RemoveCollectionTask(int collection_id); void RecordSampleTask(int collection_id); void ShutdownTask(int add_events); @@ -402,7 +408,8 @@ base::TimeTicks period_end, int64_t name_hash, absl::optional<int64_t> key, - int64_t value) { + int64_t value, + absl::optional<PlatformThreadId> thread_id) { ThreadExecutionState state; scoped_refptr<SingleThreadTaskRunner> task_runner = GetTaskRunner(&state); if (state != RUNNING) @@ -411,7 +418,7 @@ task_runner->PostTask( FROM_HERE, BindOnce(&SamplingThread::ApplyMetadataToPastSamplesTask, Unretained(this), period_start, period_end, name_hash, - key, value)); + key, value, thread_id)); } void StackSamplingProfiler::SamplingThread::Remove(int collection_id) { @@ -570,10 +577,13 @@ base::TimeTicks period_end, int64_t name_hash, absl::optional<int64_t> key, - int64_t value) { + int64_t value, + absl::optional<PlatformThreadId> thread_id) { DCHECK_EQ(GetThreadId(), PlatformThread::CurrentId()); - MetadataRecorder::Item item(name_hash, key, value); + MetadataRecorder::Item item(name_hash, key, thread_id, value); for (auto& id_collection_pair : active_collections_) { + if (thread_id && id_collection_pair.second->thread_id != thread_id) + continue; id_collection_pair.second->profile_builder->ApplyMetadataRetrospectively( period_start, period_end, item); } @@ -642,7 +652,8 @@ // Record a single sample. collection->sampler->RecordStackFrames(stack_buffer_.get(), - collection->profile_builder.get()); + collection->profile_builder.get(), + collection->thread_id); // Schedule the next sample recording if there is one. if (++collection->sample_count < collection->params.samples_per_profile) { @@ -778,7 +789,10 @@ UnwindersFactory core_unwinders_factory, RepeatingClosure record_sample_callback, StackSamplerTestDelegate* test_delegate) - : StackSamplingProfiler(params, std::move(profile_builder), nullptr) { + : StackSamplingProfiler(thread_token, + params, + std::move(profile_builder), + std::unique_ptr<StackSampler>()) { sampler_ = StackSampler::Create(thread_token, profile_builder_->GetModuleCache(), std::move(core_unwinders_factory), @@ -786,10 +800,12 @@ } StackSamplingProfiler::StackSamplingProfiler( + SamplingProfilerThreadToken thread_token, const SamplingParams& params, std::unique_ptr<ProfileBuilder> profile_builder, std::unique_ptr<StackSampler> sampler) - : params_(params), + : thread_token_(thread_token), + params_(params), profile_builder_(std::move(profile_builder)), sampler_(std::move(sampler)), // The event starts "signaled" so code knows it's safe to start thread @@ -852,7 +868,7 @@ DCHECK_EQ(kNullProfilerId, profiler_id_); profiler_id_ = SamplingThread::GetInstance()->Add( std::make_unique<SamplingThread::CollectionContext>( - params_, &profiling_inactive_, std::move(sampler_), + thread_token_.id, params_, &profiling_inactive_, std::move(sampler_), std::move(profile_builder_))); DCHECK_NE(kNullProfilerId, profiler_id_); @@ -887,9 +903,10 @@ base::TimeTicks period_end, int64_t name_hash, absl::optional<int64_t> key, - int64_t value) { + int64_t value, + absl::optional<PlatformThreadId> thread_id) { SamplingThread::GetInstance()->ApplyMetadataToPastSamples( - period_start, period_end, name_hash, key, value); + period_start, period_end, name_hash, key, value, thread_id); } } // namespace base
diff --git a/base/profiler/stack_sampling_profiler.h b/base/profiler/stack_sampling_profiler.h index c36deb5..2435b40 100644 --- a/base/profiler/stack_sampling_profiler.h +++ b/base/profiler/stack_sampling_profiler.h
@@ -111,7 +111,8 @@ // Same as above function, with custom |sampler| implementation. The sampler // on Android is not implemented in base. - StackSamplingProfiler(const SamplingParams& params, + StackSamplingProfiler(SamplingProfilerThreadToken thread_token, + const SamplingParams& params, std::unique_ptr<ProfileBuilder> profile_builder, std::unique_ptr<StackSampler> sampler); @@ -182,19 +183,23 @@ // Friend the global function from sample_metadata.cc so that it can call into // the function below. - friend void ApplyMetadataToPastSamplesImpl(TimeTicks period_start, - TimeTicks period_end, - int64_t name_hash, - absl::optional<int64_t> key, - int64_t value); + friend void ApplyMetadataToPastSamplesImpl( + TimeTicks period_start, + TimeTicks period_end, + int64_t name_hash, + absl::optional<int64_t> key, + int64_t value, + absl::optional<PlatformThreadId> thread_id); // Apply metadata to already recorded samples. See the // ApplyMetadataToPastSamples() docs in sample_metadata.h. - static void ApplyMetadataToPastSamples(TimeTicks period_start, - TimeTicks period_end, - int64_t name_hash, - absl::optional<int64_t> key, - int64_t value); + static void ApplyMetadataToPastSamples( + TimeTicks period_start, + TimeTicks period_end, + int64_t name_hash, + absl::optional<int64_t> key, + int64_t value, + absl::optional<PlatformThreadId> thread_id); // The thread whose stack will be sampled. SamplingProfilerThreadToken thread_token_;
diff --git a/base/profiler/stack_sampling_profiler_test_util.cc b/base/profiler/stack_sampling_profiler_test_util.cc index 975ee98..b00a2ab 100644 --- a/base/profiler/stack_sampling_profiler_test_util.cc +++ b/base/profiler/stack_sampling_profiler_test_util.cc
@@ -161,6 +161,14 @@ TargetThread::~TargetThread() = default; +void TargetThread::Start() { + EXPECT_TRUE(PlatformThread::Create(0, this, &target_thread_handle_)); +} + +void TargetThread::Join() { + PlatformThread::Join(target_thread_handle_); +} + void TargetThread::ThreadMain() { thread_token_ = GetSamplingProfilerCurrentThreadToken(); std::move(to_run_).Run(); @@ -281,16 +289,13 @@ TargetThread target_thread( BindLambdaForTesting([&]() { scenario->Execute(&events); })); - PlatformThreadHandle target_thread_handle; - EXPECT_TRUE(PlatformThread::Create(0, &target_thread, &target_thread_handle)); - + target_thread.Start(); events.ready_for_sample.Wait(); std::move(profile_callback).Run(target_thread.thread_token()); events.sample_finished.Signal(); - - PlatformThread::Join(target_thread_handle); + target_thread.Join(); } std::vector<Frame> SampleScenario(UnwindScenario* scenario,
diff --git a/base/profiler/stack_sampling_profiler_test_util.h b/base/profiler/stack_sampling_profiler_test_util.h index c23200ec..057921ce 100644 --- a/base/profiler/stack_sampling_profiler_test_util.h +++ b/base/profiler/stack_sampling_profiler_test_util.h
@@ -26,13 +26,16 @@ // A thread to target for profiling that will run the supplied closure. class TargetThread : public PlatformThread::Delegate { public: - TargetThread(OnceClosure to_run); + explicit TargetThread(OnceClosure to_run); TargetThread(const TargetThread&) = delete; TargetThread& operator=(const TargetThread&) = delete; ~TargetThread() override; + void Start(); + void Join(); + // PlatformThread::Delegate: void ThreadMain() override; @@ -41,6 +44,7 @@ private: SamplingProfilerThreadToken thread_token_ = {0}; OnceClosure to_run_; + PlatformThreadHandle target_thread_handle_; }; // Addresses near the start and end of a function.
diff --git a/base/profiler/stack_sampling_profiler_unittest.cc b/base/profiler/stack_sampling_profiler_unittest.cc index 0f402ae..1cff465 100644 --- a/base/profiler/stack_sampling_profiler_unittest.cc +++ b/base/profiler/stack_sampling_profiler_unittest.cc
@@ -310,10 +310,7 @@ UnwindScenario::SampleEvents events; TargetThread target_thread( BindLambdaForTesting([&]() { scenario.Execute(&events); })); - - PlatformThreadHandle target_thread_handle; - EXPECT_TRUE(PlatformThread::Create(0, &target_thread, &target_thread_handle)); - + target_thread.Start(); events.ready_for_sample.Wait(); WaitableEvent sampling_thread_completed( @@ -347,7 +344,7 @@ // Cause the target thread to finish, so that it's no longer executing code in // the library we're about to unload. events.sample_finished.Signal(); - PlatformThread::Join(target_thread_handle); + target_thread.Join(); // Unload the library now that it's not being used. if (wait_until_unloaded) @@ -1133,19 +1130,14 @@ UnwindScenario::SampleEvents events1; TargetThread target_thread1( BindLambdaForTesting([&]() { scenario1.Execute(&events1); })); - PlatformThreadHandle target_thread_handle1; - EXPECT_TRUE( - PlatformThread::Create(0, &target_thread1, &target_thread_handle1)); + target_thread1.Start(); events1.ready_for_sample.Wait(); UnwindScenario scenario2(BindRepeating(&CallWithPlainFunction)); UnwindScenario::SampleEvents events2; TargetThread target_thread2( BindLambdaForTesting([&]() { scenario2.Execute(&events2); })); - - PlatformThreadHandle target_thread_handle2; - EXPECT_TRUE( - PlatformThread::Create(0, &target_thread2, &target_thread_handle2)); + target_thread2.Start(); events2.ready_for_sample.Wait(); // Providing an initial delay makes it more likely that both will be @@ -1201,8 +1193,8 @@ events1.sample_finished.Signal(); events2.sample_finished.Signal(); - PlatformThread::Join(target_thread_handle1); - PlatformThread::Join(target_thread_handle2); + target_thread1.Join(); + target_thread2.Join(); } // A simple thread that runs a profiler on another thread. @@ -1523,4 +1515,99 @@ EXPECT_EQ(11, metadata2.item.value); } +PROFILER_TEST_F( + StackSamplingProfilerTest, + ApplyMetadataToPastSamples_PassedToProfileBuilder_MultipleCollections) { + SamplingParams params; + params.sampling_interval = Milliseconds(10); + // 10,000 samples ensures the profiler continues running until manually + // stopped, after applying metadata. + params.samples_per_profile = 10000; + ModuleCache module_cache1, module_cache2; + + WaitableEvent profiler1_started; + WaitableEvent profiler2_started; + WaitableEvent profiler1_metadata_applied; + WaitableEvent profiler2_metadata_applied; + + Profile profile1; + WaitableEvent sampling_completed1; + TargetThread target_thread1(BindLambdaForTesting([&]() { + StackSamplingProfiler profiler1( + target_thread1.thread_token(), params, + std::make_unique<TestProfileBuilder>( + &module_cache1, BindLambdaForTesting([&](Profile result_profile) { + profile1 = std::move(result_profile); + sampling_completed1.Signal(); + })), + CreateCoreUnwindersFactoryForTesting(&module_cache1), + RepeatingClosure()); + profiler1.Start(); + profiler1_started.Signal(); + profiler2_started.Wait(); + + // Record metadata on past samples only for this thread. The time range + // shouldn't affect the outcome, it should always be passed to the + // ProfileBuilder. + ApplyMetadataToPastSamples(TimeTicks(), TimeTicks::Now(), "TestMetadata1", + 10, 10, SampleMetadataScope::kThread); + + profiler1_metadata_applied.Signal(); + profiler2_metadata_applied.Wait(); + profiler1.Stop(); + })); + target_thread1.Start(); + + Profile profile2; + WaitableEvent sampling_completed2; + TargetThread target_thread2(BindLambdaForTesting([&]() { + StackSamplingProfiler profiler2( + target_thread2.thread_token(), params, + std::make_unique<TestProfileBuilder>( + &module_cache2, BindLambdaForTesting([&](Profile result_profile) { + profile2 = std::move(result_profile); + sampling_completed2.Signal(); + })), + CreateCoreUnwindersFactoryForTesting(&module_cache2), + RepeatingClosure()); + profiler2.Start(); + profiler2_started.Signal(); + profiler1_started.Wait(); + + // Record metadata on past samples only for this thread. + ApplyMetadataToPastSamples(TimeTicks(), TimeTicks::Now(), "TestMetadata2", + 20, 20, SampleMetadataScope::kThread); + + profiler2_metadata_applied.Signal(); + profiler1_metadata_applied.Wait(); + profiler2.Stop(); + })); + target_thread2.Start(); + + target_thread1.Join(); + target_thread2.Join(); + + // Wait for the profile to be captured before checking expectations. + sampling_completed1.Wait(); + sampling_completed2.Wait(); + + ASSERT_EQ(1u, profile1.retrospective_metadata.size()); + ASSERT_EQ(1u, profile2.retrospective_metadata.size()); + + { + const RetrospectiveMetadata& metadata1 = profile1.retrospective_metadata[0]; + EXPECT_EQ(HashMetricName("TestMetadata1"), metadata1.item.name_hash); + ASSERT_TRUE(metadata1.item.key.has_value()); + EXPECT_EQ(10, *metadata1.item.key); + EXPECT_EQ(10, metadata1.item.value); + } + { + const RetrospectiveMetadata& metadata2 = profile2.retrospective_metadata[0]; + EXPECT_EQ(HashMetricName("TestMetadata2"), metadata2.item.name_hash); + ASSERT_TRUE(metadata2.item.key.has_value()); + EXPECT_EQ(20, *metadata2.item.key); + EXPECT_EQ(20, metadata2.item.value); + } +} + } // namespace base
diff --git a/base/trace_event/OWNERS b/base/trace_event/OWNERS index 93ff780..9e3a80db 100644 --- a/base/trace_event/OWNERS +++ b/base/trace_event/OWNERS
@@ -1,8 +1,8 @@ eseckler@chromium.org nuskos@chromium.org -oysteine@chromium.org primiano@chromium.org skyostil@chromium.org +altimin@chromium.org # For memory-infra related changes ssid@chromium.org
diff --git a/build/config/android/config.gni b/build/config/android/config.gni index 5fa6099..47321456 100644 --- a/build/config/android/config.gni +++ b/build/config/android/config.gni
@@ -69,6 +69,10 @@ } } + # Avoid typos when setting android_static_analysis in args.gn. + assert(android_static_analysis == "on" || android_static_analysis == "off" || + android_static_analysis == "build_server") + declare_args() { # Android API level for 32 bits platforms android32_ndk_api_level = default_min_sdk_version
diff --git a/build/config/c++/BUILD.gn b/build/config/c++/BUILD.gn index e7ed69e..54b6de8 100644 --- a/build/config/c++/BUILD.gn +++ b/build/config/c++/BUILD.gn
@@ -7,16 +7,8 @@ assert(use_custom_libcxx, "should only be used if use_custom_libcxx is set") declare_args() { - # lldb pretty printing only works when libc++ is built in the __1 (or __ndk1) - # namespaces. For pretty printing to work out-of-the-box on Mac (where lldb - # is primarily used), this flag is set to false to build with the __1 - # namespace (to maintain ABI compatibility, this implies building without - # _LIBCPP_ABI_UNSTABLE). This is not necessary on non-component builds - # because we leave the ABI version set to __1 in that case because libc++ - # symbols are not exported. - # TODO(thomasanderson): Set this to true by default once rL352899 is available - # in MacOS's lldb. - libcxx_abi_unstable = !(is_apple && is_debug && is_component_build) + # TODO(thakis): Make this just a variable, not an arg. + libcxx_abi_unstable = true } # TODO(xiaohuic): https://crbug/917533 Crashes on internal ChromeOS build.
diff --git a/build/config/chromecast/OWNERS b/build/config/chromecast/OWNERS new file mode 100644 index 0000000..4a55afde --- /dev/null +++ b/build/config/chromecast/OWNERS
@@ -0,0 +1,5 @@ +btolsch@chromium.org +mfoltz@chromium.org +rwkeane@google.com +seantopping@chromium.org +
diff --git a/build/config/chromecast_build.gni b/build/config/chromecast_build.gni index 65855a1..13367561 100644 --- a/build/config/chromecast_build.gni +++ b/build/config/chromecast_build.gni
@@ -5,21 +5,30 @@ # The args declared in this file should be referenced by components outside of # //chromecast. Args needed only in //chromecast should be declared in # //chromecast/chromecast.gni. +# +# TODO(crbug.com/1294964): Rename this file after is_chromecast is removed. declare_args() { - # Set this true for a Chromecast build. Chromecast builds are supported on - # Linux and Android. + # DEPRECATED. This flag will be removed in the future; see https://crbug.com/1219802. + # + # New code should use enable_cast_receiver if the feature in question is + # required for all Cast-enabled browsers, or an alternative buildflag if it is + # for specific types of devices. is_chromecast = false # If true, IS_CAST_DEBUG_BUILD() will evaluate to 1 in version.h. Otherwise, # it will evaluate to 0. Overriding this when is_debug=false is useful for # doing engineering builds. + # TODO(crbug.com/1293511): Move to //chromecast or eliminate. cast_is_debug = is_debug # chromecast_branding is used to include or exclude Google-branded components. # Set it to "public" for a Chromium build. + # TODO(crbug.com/1293517): Remove usages in Chromium and move to //chromecast. chromecast_branding = "public" # Set this true for an audio-only Chromecast build. + # TODO(crbug.com/1293538): Replace with a buildflag for speaker-only builds not + # specific to Cast. is_cast_audio_only = false # If non empty, rpath of executables is set to this. @@ -28,31 +37,40 @@ # Set true to enable modular_updater. enable_modular_updater = false + + # True to enable the cast audio renderer. + # + # TODO(crbug.com/1293520): Remove this buildflag. + enable_cast_audio_renderer = false } -# Note(slan): This arg depends on the value of is_chromecast, and thus must be -# declared in a separate block. These blocks can be combined when/if -# crbug.com/542846 is resolved. +declare_args() { + # Set this true for a Chromecast build. Chromecast builds are supported on + # Linux and Android. + # + # During the migration from is_chromecast, this must be set to the same value + # as is_chromecast. + enable_cast_receiver = is_chromecast +} + declare_args() { # True if Chromecast build is targeted for linux desktop. This type of build # is useful for testing and development, but currently supports only a subset # of Cast functionality. Though this defaults to true for x86 Linux devices, # this should be overriden manually for an embedded x86 build. # TODO(slan): Remove instances of this when x86 is a fully supported platform. - is_cast_desktop_build = is_chromecast && target_os == "linux" && + # + # TODO(crbug.com/1293569): Move is_cast_desktop_build to //chromecast. + is_cast_desktop_build = enable_cast_receiver && target_os == "linux" && (target_cpu == "x86" || target_cpu == "x64") -} -declare_args() { # True to enable the cast renderer. It is enabled by default for linux and # android audio only builds. - enable_cast_renderer = is_chromecast && (is_linux || is_chromeos || - (is_cast_audio_only && is_android)) -} - -declare_args() { - # True to enable the cast audio renderer. - enable_cast_audio_renderer = false + # + # TODO(crbug.com/1293520): Remove this buildflag. + enable_cast_renderer = + enable_cast_receiver && + (is_linux || is_chromeos || (is_cast_audio_only && is_android)) } # Configures media options for cast. See media/media_options.gni @@ -108,9 +126,16 @@ } # Assert that Chromecast is being built for a supported platform. -assert(is_linux || is_chromeos || is_android || is_fuchsia || !is_chromecast, - "Chromecast builds are not supported on $target_os") +assert(is_linux || is_chromeos || is_android || is_fuchsia || + !enable_cast_receiver, + "Cast receiver builds are not supported on $target_os") # Assert that is_cast_audio_only and is_cast_desktop_build are both false on a # non-Chromecast build. -assert(is_chromecast || (!is_cast_audio_only && !is_cast_desktop_build)) +# +# NOTE: This restriction should be removed in the future as it should be +# possible to build an audio-only Cast-enabled browser on any platform. +assert(enable_cast_receiver || (!is_cast_audio_only && !is_cast_desktop_build)) + +assert(enable_cast_receiver == is_chromecast, + "enable_cast_receiver and is_chromecast must be set to the same value.")
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 38d9f3e5..ae43813 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -7.20220302.1.1 +7.20220302.3.1
diff --git a/cc/document_transition/document_transition_request.cc b/cc/document_transition/document_transition_request.cc index 3d2eb1df..0783540c 100644 --- a/cc/document_transition/document_transition_request.cc +++ b/cc/document_transition/document_transition_request.cc
@@ -35,117 +35,45 @@ return "<unknown>"; } -std::string EffectToString( - viz::CompositorFrameTransitionDirective::Effect effect) { - switch (effect) { - case viz::CompositorFrameTransitionDirective::Effect::kNone: - return "kNone"; - case viz::CompositorFrameTransitionDirective::Effect::kCoverDown: - return "kCoverDown"; - case viz::CompositorFrameTransitionDirective::Effect::kCoverLeft: - return "kCoverLeft"; - case viz::CompositorFrameTransitionDirective::Effect::kCoverRight: - return "kCoverRight"; - case viz::CompositorFrameTransitionDirective::Effect::kCoverUp: - return "kCoverUp"; - case viz::CompositorFrameTransitionDirective::Effect::kExplode: - return "kExplode"; - case viz::CompositorFrameTransitionDirective::Effect::kFade: - return "kFade"; - case viz::CompositorFrameTransitionDirective::Effect::kImplode: - return "kImplode"; - case viz::CompositorFrameTransitionDirective::Effect::kRevealDown: - return "kRevealDown"; - case viz::CompositorFrameTransitionDirective::Effect::kRevealLeft: - return "kRevealLeft"; - case viz::CompositorFrameTransitionDirective::Effect::kRevealRight: - return "kRevealRight"; - case viz::CompositorFrameTransitionDirective::Effect::kRevealUp: - return "kRevealUp"; - } - return "<unknown>"; -} - } // namespace uint32_t DocumentTransitionRequest::s_next_sequence_id_ = 1; // static std::unique_ptr<DocumentTransitionRequest> -DocumentTransitionRequest::CreatePrepare( - Effect effect, - uint32_t document_tag, - TransitionConfig root_config, - std::vector<TransitionConfig> shared_element_config, - base::OnceClosure commit_callback, - bool is_renderer_driven_animation) { +DocumentTransitionRequest::CreateCapture(uint32_t document_tag, + uint32_t shared_element_count, + base::OnceClosure commit_callback) { return base::WrapUnique(new DocumentTransitionRequest( - effect, document_tag, root_config, shared_element_config, - std::move(commit_callback), is_renderer_driven_animation)); -} - -// static -std::unique_ptr<DocumentTransitionRequest> -DocumentTransitionRequest::CreateStart(uint32_t document_tag, - uint32_t shared_element_count, - base::OnceClosure commit_callback) { - return base::WrapUnique(new DocumentTransitionRequest( - document_tag, shared_element_count, std::move(commit_callback))); + Type::kSave, document_tag, shared_element_count, + std::move(commit_callback))); } // static std::unique_ptr<DocumentTransitionRequest> DocumentTransitionRequest::CreateAnimateRenderer(uint32_t document_tag) { - return base::WrapUnique( - new DocumentTransitionRequest(Type::kAnimateRenderer, document_tag)); + return base::WrapUnique(new DocumentTransitionRequest( + Type::kAnimateRenderer, document_tag, 0u, base::DoNothing())); } // static std::unique_ptr<DocumentTransitionRequest> DocumentTransitionRequest::CreateRelease(uint32_t document_tag) { - return base::WrapUnique( - new DocumentTransitionRequest(Type::kRelease, document_tag)); + return base::WrapUnique(new DocumentTransitionRequest( + Type::kRelease, document_tag, 0u, base::DoNothing())); } DocumentTransitionRequest::DocumentTransitionRequest( - Effect effect, - uint32_t document_tag, - TransitionConfig root_config, - std::vector<TransitionConfig> shared_element_config, - base::OnceClosure commit_callback, - bool is_renderer_driven_animation) - : type_(Type::kSave), - effect_(effect), - root_config_(root_config), - document_tag_(document_tag), - shared_element_count_(shared_element_config.size()), - shared_element_config_(std::move(shared_element_config)), - commit_callback_(std::move(commit_callback)), - is_renderer_driven_animation_(is_renderer_driven_animation), - sequence_id_(s_next_sequence_id_++) {} - -DocumentTransitionRequest::DocumentTransitionRequest( + Type type, uint32_t document_tag, uint32_t shared_element_count, base::OnceClosure commit_callback) - : type_(Type::kAnimate), + : type_(type), document_tag_(document_tag), shared_element_count_(shared_element_count), commit_callback_(std::move(commit_callback)), - is_renderer_driven_animation_(false), sequence_id_(s_next_sequence_id_++) {} -DocumentTransitionRequest::DocumentTransitionRequest(Type type, - uint32_t document_tag) - : type_(type), - document_tag_(document_tag), - shared_element_count_(0u), - commit_callback_(base::DoNothing()), - is_renderer_driven_animation_(true), - sequence_id_(s_next_sequence_id_++) { - DCHECK(type_ == Type::kAnimateRenderer || type_ == Type::kRelease); -} - DocumentTransitionRequest::~DocumentTransitionRequest() = default; viz::CompositorFrameTransitionDirective @@ -154,15 +82,7 @@ shared_element_render_pass_id_map) const { std::vector<viz::CompositorFrameTransitionDirective::SharedElement> shared_elements(shared_element_count_); - DCHECK(shared_element_config_.empty() || - shared_element_config_.size() == shared_elements.size()); for (uint32_t i = 0; i < shared_elements.size(); ++i) { - // For transitions with a null element on the source page, we won't find a - // render pass below. But we still need to propagate the configuration - // params. - if (!shared_element_config_.empty()) - shared_elements[i].config = shared_element_config_[i]; - auto it = std::find_if( shared_element_render_pass_id_map.begin(), shared_element_render_pass_id_map.end(), @@ -175,16 +95,17 @@ shared_elements[i].render_pass_id = it->second.render_pass_id; shared_elements[i].shared_element_resource_id = it->second.resource_id; } + // TODO(vmpstr): Clean up the directive parameters. return viz::CompositorFrameTransitionDirective( - sequence_id_, type_, is_renderer_driven_animation_, effect_, root_config_, + sequence_id_, type_, /*is_renderer_driven_animation=*/true, + viz::CompositorFrameTransitionDirective::Effect::kNone, {}, std::move(shared_elements)); } std::string DocumentTransitionRequest::ToString() const { std::ostringstream str; - str << "[type: " << TypeToString(type_) - << " effect: " << EffectToString(effect_) - << " sequence_id: " << sequence_id_ << "]"; + str << "[type: " << TypeToString(type_) << " sequence_id: " << sequence_id_ + << "]"; return str.str(); }
diff --git a/cc/document_transition/document_transition_request.h b/cc/document_transition/document_transition_request.h index a16c3a4..6bda2402 100644 --- a/cc/document_transition/document_transition_request.h +++ b/cc/document_transition/document_transition_request.h
@@ -24,21 +24,8 @@ // transition to occur. class CC_EXPORT DocumentTransitionRequest { public: - using Effect = viz::CompositorFrameTransitionDirective::Effect; - using TransitionConfig = - viz::CompositorFrameTransitionDirective::TransitionConfig; - - // Creates a Type::kPrepare type of request. - static std::unique_ptr<DocumentTransitionRequest> CreatePrepare( - Effect effect, - uint32_t document_tag, - TransitionConfig root_config, - std::vector<TransitionConfig> shared_element_config, - base::OnceClosure commit_callback, - bool is_renderer_driven_animation); - - // Creates a Type::kSave type of request. - static std::unique_ptr<DocumentTransitionRequest> CreateStart( + // Creates a Type::kCapture type of request. + static std::unique_ptr<DocumentTransitionRequest> CreateCapture( uint32_t document_tag, uint32_t shared_element_count, base::OnceClosure commit_callback); @@ -87,25 +74,15 @@ private: using Type = viz::CompositorFrameTransitionDirective::Type; - DocumentTransitionRequest(Effect effect, + DocumentTransitionRequest(Type type, uint32_t document_tag, - TransitionConfig root_config, - std::vector<TransitionConfig> shared_element_config, - base::OnceClosure commit_callback, - bool is_renderer_driven_animation); - DocumentTransitionRequest(uint32_t document_tag, uint32_t shared_element_count, base::OnceClosure commit_callback); - DocumentTransitionRequest(Type type, uint32_t document_tag); const Type type_; - const Effect effect_ = Effect::kNone; - const TransitionConfig root_config_; const uint32_t document_tag_; const uint32_t shared_element_count_; - const std::vector<TransitionConfig> shared_element_config_; base::OnceClosure commit_callback_; - const bool is_renderer_driven_animation_; const uint32_t sequence_id_; static uint32_t s_next_sequence_id_;
diff --git a/cc/document_transition/document_transition_request_unittest.cc b/cc/document_transition/document_transition_request_unittest.cc index a1f3b553..40f6af6e 100644 --- a/cc/document_transition/document_transition_request_unittest.cc +++ b/cc/document_transition/document_transition_request_unittest.cc
@@ -15,10 +15,8 @@ bool called = false; auto callback = base::BindLambdaForTesting([&called]() { called = true; }); - auto request = DocumentTransitionRequest::CreatePrepare( - DocumentTransitionRequest::Effect::kRevealLeft, - /*document_tag=*/0, DocumentTransitionRequest::TransitionConfig(), - /*shared_element_config=*/{}, std::move(callback), false); + auto request = DocumentTransitionRequest::CreateCapture( + /*document_tag=*/0, /*shared_element_count=*/0, std::move(callback)); EXPECT_FALSE(called); request->TakeFinishedCallback().Run(); @@ -27,36 +25,29 @@ auto directive = request->ConstructDirective({}); EXPECT_GT(directive.sequence_id(), 0u); - EXPECT_EQ(DocumentTransitionRequest::Effect::kRevealLeft, directive.effect()); EXPECT_EQ(viz::CompositorFrameTransitionDirective::Type::kSave, directive.type()); - EXPECT_FALSE(directive.is_renderer_driven_animation()); + EXPECT_TRUE(directive.is_renderer_driven_animation()); auto duplicate = request->ConstructDirective({}); EXPECT_EQ(duplicate.sequence_id(), directive.sequence_id()); - EXPECT_EQ(duplicate.effect(), directive.effect()); EXPECT_EQ(duplicate.type(), directive.type()); EXPECT_EQ(duplicate.is_renderer_driven_animation(), directive.is_renderer_driven_animation()); } TEST(DocumentTransitionRequestTest, StartRequest) { - bool called = false; - auto callback = base::BindLambdaForTesting([&called]() { called = true; }); + auto request = DocumentTransitionRequest::CreateAnimateRenderer( + /*document_tag=*/0); - auto request = DocumentTransitionRequest::CreateStart( - /*document_tag=*/0, /*shared_element_transition=*/0, std::move(callback)); - - EXPECT_FALSE(called); request->TakeFinishedCallback().Run(); - EXPECT_TRUE(called); EXPECT_TRUE(request->TakeFinishedCallback().is_null()); auto directive = request->ConstructDirective({}); EXPECT_GT(directive.sequence_id(), 0u); - EXPECT_EQ(viz::CompositorFrameTransitionDirective::Type::kAnimate, + EXPECT_EQ(viz::CompositorFrameTransitionDirective::Type::kAnimateRenderer, directive.type()); - EXPECT_FALSE(directive.is_renderer_driven_animation()); + EXPECT_TRUE(directive.is_renderer_driven_animation()); } } // namespace cc
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index fc42c4e..d6422192 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -18200,8 +18200,8 @@ // Adding a transition effect should cause us to redraw. host_impl_->active_tree()->AddDocumentTransitionRequest( - DocumentTransitionRequest::CreateStart( - /*document_tag=*/0, /*shared_element_count=*/0, base::OnceClosure())); + DocumentTransitionRequest::CreateAnimateRenderer( + /*document_tag=*/0)); // Ensure there is damage and we requested a redraw. host_impl_->OnDraw(draw_transform, draw_viewport, resourceless_software_draw,
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index cb9d5c6..158478c 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -9865,14 +9865,7 @@ void BeginTest() override { layer_tree_host()->AddDocumentTransitionRequest( - DocumentTransitionRequest::CreatePrepare( - DocumentTransitionRequest::Effect::kExplode, - /*document_tag=*/0, DocumentTransitionRequest::TransitionConfig(), - /*shared_element_config=*/{}, - base::BindLambdaForTesting([this]() { CommitLambdaCalled(); }), - /*is_renderer_driven_animation=*/false)); - layer_tree_host()->AddDocumentTransitionRequest( - DocumentTransitionRequest::CreateStart( + DocumentTransitionRequest::CreateCapture( /*document_tag=*/0, /*shared_element_count=*/0, base::BindLambdaForTesting([this]() { CommitLambdaCalled(); }))); } @@ -9881,20 +9874,12 @@ void DisplayReceivedCompositorFrameOnThread( const viz::CompositorFrame& frame) override { - ASSERT_EQ(2u, frame.metadata.transition_directives.size()); + ASSERT_EQ(1u, frame.metadata.transition_directives.size()); const auto& save = frame.metadata.transition_directives[0]; submitted_sequence_ids_.push_back(save.sequence_id()); EXPECT_EQ(save.type(), viz::CompositorFrameTransitionDirective::Type::kSave); - EXPECT_EQ(save.effect(), - viz::CompositorFrameTransitionDirective::Effect::kExplode); - - const auto& animate = frame.metadata.transition_directives[1]; - EXPECT_GT(animate.sequence_id(), save.sequence_id()); - EXPECT_EQ(animate.type(), - viz::CompositorFrameTransitionDirective::Type::kAnimate); - submitted_sequence_ids_.push_back(animate.sequence_id()); } void DidReceiveCompositorFrameAck() override { @@ -9903,7 +9888,7 @@ EndTest(); } - void AfterTest() override { EXPECT_EQ(2, num_lambda_calls_); } + void AfterTest() override { EXPECT_EQ(1, num_lambda_calls_); } std::vector<uint32_t> submitted_sequence_ids_; int num_lambda_calls_ = 0;
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index f636ee5..507e2a9b 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -790,7 +790,7 @@ ] if (disable_autofill_assistant_dfm) { - deps += [ "//chrome/android/features/autofill_assistant:java" ] + deps += [ "//components/autofill_assistant/android:java" ] } if (disable_tab_ui_dfm) { @@ -806,7 +806,6 @@ group("jni_headers") { public_deps = [ ":chrome_jni_headers", - "//chrome/android/features/autofill_assistant:jni_headers", "//chrome/android/features/autofill_assistant:jni_headers_public", "//chrome/android/features/keyboard_accessory:jni_headers", "//chrome/android/features/start_surface:jni_headers", @@ -840,6 +839,7 @@ "//chrome/browser/ui/messages/android:jni_headers", "//chrome/browser/util:jni_headers", "//chrome/browser/webauthn/android:jni_headers", + "//components/autofill_assistant/android:jni_headers", "//components/autofill_assistant/android:jni_headers_public", "//components/image_fetcher:jni_headers", "//components/media_router/browser/android:jni_headers",
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn index eeda1e6..0c60318 100644 --- a/chrome/android/features/autofill_assistant/BUILD.gn +++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -9,204 +9,6 @@ import("//chrome/common/features.gni") import("//tools/grit/grit_rule.gni") -android_library("java") { - resources_package = "org.chromium.chrome.autofill_assistant" - deps = [ - "//base:base_java", - "//chrome/android:base_module_java", - "//chrome/android:chrome_java", - "//chrome/browser/browser_controls/android:java", - "//chrome/browser/feedback/android:java", - "//chrome/browser/profiles/android:java", - "//chrome/browser/settings:java", - "//chrome/browser/signin/services/android:java", - "//chrome/browser/tab:java", - "//chrome/browser/ui/android/omnibox:java", - "//chrome/browser/ui/messages/android:java", - "//chrome/browser/util:java", - "//components/autofill/android:autofill_java", - "//components/autofill/android:prefeditor_autofill_java", - "//components/autofill_assistant/android:autofill_assistant_public_java", - "//components/autofill_assistant/android:java", - "//components/autofill_assistant/android:java_resources", - "//components/autofill_assistant/android:public_java", - "//components/browser_ui/bottomsheet/android:java", - "//components/browser_ui/modaldialog/android:java", - "//components/browser_ui/settings/android:java", - "//components/browser_ui/styles/android:java", - "//components/browser_ui/widget/android:java", - "//components/embedder_support/android:util_java", - "//components/favicon/android:java", - "//components/image_fetcher:java", - "//components/payments/content/android:java", - "//components/policy/android:policy_java", - "//components/signin/public/android:java", - "//components/url_formatter/android:url_formatter_java", - "//components/version_info/android:version_constants_java", - "//content/public/android:content_java", - "//mojo/public/java:bindings_java", - "//third_party/android_deps:android_support_v7_appcompat_java", - "//third_party/android_deps:com_android_support_support_annotations_java", - "//third_party/android_deps:material_design_java", - "//third_party/androidx:androidx_annotation_annotation_java", - "//third_party/androidx:androidx_appcompat_appcompat_resources_java", - "//third_party/androidx:androidx_collection_collection_java", - "//third_party/androidx:androidx_coordinatorlayout_coordinatorlayout_java", - "//third_party/androidx:androidx_core_core_java", - "//third_party/androidx:androidx_gridlayout_gridlayout_java", - "//third_party/androidx:androidx_lifecycle_lifecycle_common_java", - "//third_party/androidx:androidx_lifecycle_lifecycle_runtime_java", - "//third_party/androidx:androidx_recyclerview_recyclerview_java", - "//third_party/blink/public/mojom:android_mojo_bindings_java", - "//ui/android:ui_java", - "//url:gurl_java", - ] - - sources = [ - "java/src/org/chromium/chrome/browser/autofill_assistant/AbstractListObserver.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarNativeDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDialogButton.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantInfoPopup.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantKeyboardCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperImpl.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPeekHeightCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantRootViewContainer.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDependencyInjector.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionImpl.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantModuleEntryImpl.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsDecoration.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantCarouselModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChip.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipAdapter.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipViewHolder.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/ButtonView.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsAdapter.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantPlaceholdersConfiguration.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/ImageClickthroughData.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionChoice.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionInput.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantColor.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDimension.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDrawable.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantToggleButton.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantValue.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewEvents.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantStepProgressBar.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBox.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BaseOnboardingCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/DialogOnboardingCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingView.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayEventFilter.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScript.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantChoiceList.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantDateTime.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantInfoSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginChoice.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPhoneNumberSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantTermsSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpander.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java", - ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] -} - -generate_jni("jni_headers") { - sources = [ - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarNativeDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDialogButton.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantInfoPopup.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperImpl.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDependencyInjector.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionImpl.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChip.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantPlaceholdersConfiguration.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantColor.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDimension.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDrawable.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantValue.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewEvents.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBox.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BaseOnboardingCoordinator.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java", - "java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantDateTime.java", - ] - split_name = "autofill_assistant" -} - generate_jni("jni_headers_public") { sources = [ "public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantStaticDependenciesChrome.java" ] } @@ -234,10 +36,10 @@ ] deps = [ - ":java", ":test_support_jni_headers", "//base:base_java", "//base:base_java_test_support", + "//components/autofill_assistant/android:java", "//components/autofill_assistant/browser:proto_java", "//content/public/test/android:content_java_test_support", "//third_party/android_deps:protobuf_lite_runtime_java", @@ -305,7 +107,6 @@ deps = [ ":autofill_assistant_java_test_support", - ":java", ":test_support_jni_headers", "//base:base_java", "//base:base_java_test_support",
diff --git a/chrome/android/features/autofill_assistant/autofill_assistant_module.gni b/chrome/android/features/autofill_assistant/autofill_assistant_module.gni index 382f11ed..69d2a23 100644 --- a/chrome/android/features/autofill_assistant/autofill_assistant_module.gni +++ b/chrome/android/features/autofill_assistant/autofill_assistant_module.gni
@@ -13,7 +13,7 @@ autofill_assistant_module_desc = { name = "autofill_assistant" - java_deps = [ "//chrome/android/features/autofill_assistant:java" ] + java_deps = [ "//components/autofill_assistant/android:java" ] android_manifest = "//chrome/android/features/autofill_assistant/java/AndroidManifest.xml" uses_split = "chrome" @@ -23,7 +23,7 @@ # different manifests. autofill_assistant_module_trichrome_desc = { name = "autofill_assistant" - java_deps = [ "//chrome/android/features/autofill_assistant:java" ] + java_deps = [ "//components/autofill_assistant/android:java" ] android_manifest = "//chrome/android/features/autofill_assistant/java/AndroidManifestTrichrome.xml" uses_split = "chrome" }
diff --git a/chrome/android/features/autofill_assistant/java/DEPS b/chrome/android/features/autofill_assistant/java/DEPS deleted file mode 100644 index f46aa7e..0000000 --- a/chrome/android/features/autofill_assistant/java/DEPS +++ /dev/null
@@ -1,14 +0,0 @@ -include_rules = [ - "+components/image_fetcher", - "+chrome/browser/profiles/android/java", - "+chrome/browser/ui/messages/android/java", - "+chrome/browser/tab/java", - "+components/autofill/android", - "+components/browser_ui/settings/android", - "+components/browser_ui/widget/android", - "+components/payments/content/android", - "+content/public/android/java/src/org/chromium/content_public/browser", - "+content/public/android/java/src/org/chromium/content/browser", - "+content/public/android/java/src/org/chromium/content/browser/input", - "+content/public/android/java/src/org/chromium/content/browser/picker", -]
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java index 5d20cf6..bbf6f1f 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java
@@ -34,7 +34,6 @@ import org.chromium.base.Callback; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -42,6 +41,7 @@ import org.chromium.components.autofill_assistant.AssistantOnboardingHelper; import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntry; import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntryProvider; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java index 9bda2cf5..29dabccc 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java
@@ -43,7 +43,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.FlakyTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ClientSettingsProto; import org.chromium.chrome.browser.autofill_assistant.proto.ClientSettingsProto.IntegrationTestSettings; @@ -62,6 +61,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java index e653758..337c0ca 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java
@@ -31,13 +31,13 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.chrome.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; +import org.chromium.components.autofill_assistant.carousel.AssistantCarouselModel; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBackButtonIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBackButtonIntegrationTest.java index f298d368..ef8eb5c 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBackButtonIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBackButtonIntegrationTest.java
@@ -41,7 +41,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ClientSettingsProto; import org.chromium.chrome.browser.autofill_assistant.proto.ClientSettingsProto.BackButtonSettings; @@ -59,6 +58,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.Arrays;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java index 6ddbff0..e4e643a 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java
@@ -53,7 +53,6 @@ import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipIcon; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; @@ -81,6 +80,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantChromeTabIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantChromeTabIntegrationTest.java index b140376..76e3981 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantChromeTabIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantChromeTabIntegrationTest.java
@@ -44,7 +44,6 @@ import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.Restriction; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipType; @@ -61,6 +60,7 @@ import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.OmniboxTestUtils; import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.ui.test.util.UiRestriction;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java index 646f11d1..2280ff51 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java
@@ -61,7 +61,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.AutofillEntryProto; @@ -107,6 +106,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.WebContents; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java index 45949f5..0ed5420 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
@@ -5,8 +5,8 @@ package org.chromium.chrome.browser.autofill_assistant; import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.findViewsWithTag; -import static org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator.DIVIDER_TAG; import static org.chromium.components.autofill_assistant.AssistantTagsForTesting.COLLECT_USER_DATA_CHOICE_LIST; +import static org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataCoordinator.DIVIDER_TAG; import android.view.View; import android.widget.LinearLayout; @@ -18,20 +18,20 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataDelegate; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantLoginChoice; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantTermsAndConditionsState; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantUserDataEventType; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantVerticalExpander; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantVerticalExpanderAccordion; import org.chromium.components.autofill_assistant.AssistantAutofillProfile; import org.chromium.components.autofill_assistant.AssistantOptionModel; import org.chromium.components.autofill_assistant.AssistantPaymentInstrument; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; +import org.chromium.components.autofill_assistant.user_data.AssistantChoiceList; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataDelegate; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel; +import org.chromium.components.autofill_assistant.user_data.AssistantLoginChoice; +import org.chromium.components.autofill_assistant.user_data.AssistantTermsAndConditionsState; +import org.chromium.components.autofill_assistant.user_data.AssistantUserDataEventType; +import org.chromium.components.autofill_assistant.user_data.AssistantVerticalExpander; +import org.chromium.components.autofill_assistant.user_data.AssistantVerticalExpanderAccordion; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.HashMap; @@ -342,7 +342,7 @@ return new CreditCard("", "https://example.com", /* isLocal = */ isLocal, true, profileName, cardNumber, "1111", "12", "2050", "visa", - org.chromium.chrome.autofill_assistant.R.drawable.visa_card, billingAddressId, + org.chromium.components.autofill_assistant.R.drawable.visa_card, billingAddressId, /* serverId= */ ""); }
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java index 5b3d3a5b..590fdd5c 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
@@ -47,31 +47,33 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantCollectUserDataTestHelper.ViewHolder; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantContactField; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantLoginChoice; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantTermsAndConditionsState; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionFactory; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantStaticTextSection; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputSection; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputSection.TextInputFactory; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputType; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.autofill_assistant.AssistantAutofillCreditCard; import org.chromium.components.autofill_assistant.AssistantAutofillProfile; +import org.chromium.components.autofill_assistant.AssistantDialogButton; +import org.chromium.components.autofill_assistant.AssistantInfoPopup; import org.chromium.components.autofill_assistant.AssistantOptionModel.AddressModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.ContactModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel; import org.chromium.components.autofill_assistant.AssistantPaymentInstrument; import org.chromium.components.autofill_assistant.AssistantStaticDependencies; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel; +import org.chromium.components.autofill_assistant.user_data.AssistantContactField; +import org.chromium.components.autofill_assistant.user_data.AssistantLoginChoice; +import org.chromium.components.autofill_assistant.user_data.AssistantTermsAndConditionsState; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionFactory; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantStaticTextSection; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantTextInputSection; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantTextInputSection.TextInputFactory; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantTextInputType; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java index e1e1f640..655b710 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDetailsUiTest.java
@@ -41,15 +41,15 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetails; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsCoordinator; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsModel; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantPlaceholdersConfiguration; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.details.AssistantDetails; +import org.chromium.components.autofill_assistant.details.AssistantDetailsCoordinator; +import org.chromium.components.autofill_assistant.details.AssistantDetailsModel; +import org.chromium.components.autofill_assistant.details.AssistantPlaceholdersConfiguration; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.Arrays;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java index 57823d4b..d5104bf4 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
@@ -34,7 +34,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.directactions.DirectActionHandler; import org.chromium.chrome.browser.directactions.DirectActionReporter; @@ -44,6 +43,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java index 0b1b99da..429f11a 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFormActionTest.java
@@ -57,7 +57,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipType; @@ -80,6 +79,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java index 9361455..e0e0aa7 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
@@ -67,8 +67,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDimension; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.AutofillCreditCardProto; import org.chromium.chrome.browser.autofill_assistant.proto.AutofillFormatProto; @@ -159,6 +157,8 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.generic_ui.AssistantDimension; import java.util.ArrayList; import java.util.Arrays;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java index 44bbc78e..d66d437 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantHeaderUiTest.java
@@ -41,12 +41,6 @@ import org.mockito.junit.MockitoRule; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip.Icon; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantTtsButtonState; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; @@ -54,6 +48,12 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.autofill_assistant.AssistantDependencies; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; +import org.chromium.components.autofill_assistant.carousel.AssistantChip.Icon; +import org.chromium.components.autofill_assistant.header.AssistantHeaderCoordinator; +import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; +import org.chromium.components.autofill_assistant.header.AssistantTtsButtonState; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java index 9a4c26d..c0e861aa 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInfoBoxUiTest.java
@@ -30,14 +30,14 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBox; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxCoordinator; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxModel; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBox; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxCoordinator; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxModel; import org.chromium.content_public.browser.test.util.TestThreadUtils; /**
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantNavigationIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantNavigationIntegrationTest.java index d6a7ae47..c6e3de11 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantNavigationIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantNavigationIntegrationTest.java
@@ -32,7 +32,6 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.NavigateProto; @@ -47,6 +46,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.Arrays;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java index 06df15e..17ec41f 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayIntegrationTest.java
@@ -43,7 +43,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.BitmapDrawableProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; @@ -64,6 +63,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java index c0a0e971..539dd72 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
@@ -42,16 +42,16 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayImage; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayImage; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -96,7 +96,7 @@ throws ExecutionException { return createCoordinator(model, BitmapFactory.decodeResource(mTestRule.getActivity().getResources(), - org.chromium.chrome.autofill_assistant.R.drawable.btn_close)); + org.chromium.components.autofill_assistant.R.drawable.btn_close)); } /** Creates a coordinator for use in UI tests with a custom overlay image. */ @@ -234,7 +234,7 @@ public void testOverlayImageDoesNotCrashIfValid() throws Exception { AssistantOverlayModel model = createModel(); Bitmap bitmap = BitmapFactory.decodeResource(mTestRule.getActivity().getResources(), - org.chromium.chrome.autofill_assistant.R.drawable.btn_close); + org.chromium.components.autofill_assistant.R.drawable.btn_close); assertThat(bitmap, notNullValue()); AssistantOverlayCoordinator coordinator = createCoordinator(model, /* overlayImage = */ bitmap);
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java index 09b9b6848..6c1750b 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
@@ -67,7 +67,6 @@ import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.FlakyTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill.AutofillTestHelper; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; @@ -82,6 +81,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -725,7 +725,7 @@ isCompletelyDisplayed()); CreditCard card = new CreditCard("", "https://example.com", /* isLocal= */ true, /* isCached= */ true, "John Doe", "4111111111111111", "1111", "12", "2000", "visa", - org.chromium.chrome.autofill_assistant.R.drawable.visa_card, profileId, + org.chromium.components.autofill_assistant.R.drawable.visa_card, profileId, /* serverId= */ ""); mHelper.setCreditCard(card); waitUntilViewMatchesCondition(
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantProgressBarIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantProgressBarIntegrationTest.java index 41acbc3..95a507a 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantProgressBarIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantProgressBarIntegrationTest.java
@@ -33,7 +33,6 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.DrawableProto; @@ -49,6 +48,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.R; import org.chromium.ui.widget.ChromeImageView; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestEndpointService.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestEndpointService.java index ba64e61..56f6e934 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestEndpointService.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestEndpointService.java
@@ -6,6 +6,7 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; +import org.chromium.components.autofill_assistant.AutofillAssistantDependencyInjector; /** * Test service which communicates with a real, but non-prod endpoint.
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestService.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestService.java index 269182b..c7688c3 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestService.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestService.java
@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.GetUserDataResponseProto; import org.chromium.chrome.browser.autofill_assistant.proto.ProcessedActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.SupportsScriptResponseProto; +import org.chromium.components.autofill_assistant.AutofillAssistantDependencyInjector; import java.util.ArrayList; import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestServiceRequestSender.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestServiceRequestSender.java index e7a6b89..03daadf 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestServiceRequestSender.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestServiceRequestSender.java
@@ -9,6 +9,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; +import org.chromium.components.autofill_assistant.AutofillAssistantDependencyInjector; import java.util.ArrayList; import java.util.List;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestTtsController.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestTtsController.java index 118d90f..f3f4d03 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestTtsController.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestTtsController.java
@@ -8,6 +8,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; +import org.chromium.components.autofill_assistant.AutofillAssistantDependencyInjector; /** * Test TTS controller for use in integration tests.
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTriggerScriptIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTriggerScriptIntegrationTest.java index 3015c60..09d9bf41 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTriggerScriptIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTriggerScriptIntegrationTest.java
@@ -49,7 +49,6 @@ import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.FlakyTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.Empty; @@ -70,6 +69,7 @@ import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.autofill_assistant.AssistantFeatures; import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.content_public.browser.GestureListenerManager; import org.chromium.content_public.browser.GestureStateListener;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTtsIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTtsIntegrationTest.java index 4824350..31b1d23 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTtsIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTtsIntegrationTest.java
@@ -44,7 +44,6 @@ import org.chromium.base.Callback; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantTestTtsController.SpeakRequest; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; @@ -57,6 +56,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.R; import org.chromium.content.browser.accessibility.BrowserAccessibilityState; import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java index 810f2edf..f86e501 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
@@ -40,22 +40,23 @@ import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.UrlUtils; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetails; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBox; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxModel; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.AssistantCoordinator; import org.chromium.components.autofill_assistant.AssistantStaticDependencies; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; +import org.chromium.components.autofill_assistant.carousel.AssistantCarouselModel; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; +import org.chromium.components.autofill_assistant.details.AssistantDetails; +import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBox; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxModel; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.net.test.EmbeddedTestServer;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java index 37b7f09..1e4250ce 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
@@ -52,7 +52,6 @@ import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.CriteriaNotSatisfiedException; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.autofill_assistant.proto.ChipIcon; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; @@ -63,6 +62,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.TriggerScriptUIProto.TriggerChip; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.test.ChromeActivityTestRule; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.autofill_assistant.TriggerContext; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.image_fetcher.ImageFetcher;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUpdateClientSettingsIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUpdateClientSettingsIntegrationTest.java index 492d8720b..f9efb5c9 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUpdateClientSettingsIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUpdateClientSettingsIntegrationTest.java
@@ -25,7 +25,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipType; @@ -49,6 +48,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/BottomSheetOnboardingCoordinatorTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/BottomSheetOnboardingCoordinatorTest.java index cea0b22..50b0031 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/BottomSheetOnboardingCoordinatorTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/BottomSheetOnboardingCoordinatorTest.java
@@ -54,14 +54,7 @@ import org.chromium.base.test.util.ApplicationTestUtils; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.autofill_assistant.onboarding.AssistantOnboardingResult; -import org.chromium.chrome.browser.autofill_assistant.onboarding.BaseOnboardingCoordinator; -import org.chromium.chrome.browser.autofill_assistant.onboarding.OnboardingCoordinatorFactory; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; @@ -70,6 +63,13 @@ import org.chromium.components.autofill_assistant.AssistantBottomSheetContent; import org.chromium.components.autofill_assistant.AssistantStaticDependencies; import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.onboarding.AssistantOnboardingResult; +import org.chromium.components.autofill_assistant.onboarding.BaseOnboardingCoordinator; +import org.chromium.components.autofill_assistant.onboarding.OnboardingCoordinatorFactory; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.content_public.browser.BrowserContextHandle;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java index 2f68201b..eebe6d88 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java
@@ -42,7 +42,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaNotSatisfiedException; import org.chromium.base.test.util.DisabledTest; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; import org.chromium.chrome.browser.autofill_assistant.proto.DirectActionProto; @@ -65,6 +64,7 @@ import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntry; import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntryProvider; import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java index 813d627..b604695 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
@@ -9,16 +9,18 @@ import org.chromium.base.Callback; import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.browser.autofill_assistant.onboarding.OnboardingCoordinatorFactory; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; import org.chromium.components.autofill_assistant.AssistantDependencies; import org.chromium.components.autofill_assistant.AssistantModuleInstallUi; import org.chromium.components.autofill_assistant.AssistantOnboardingHelper; import org.chromium.components.autofill_assistant.AssistantStaticDependencies; import org.chromium.components.autofill_assistant.AutofillAssistantActionHandler; +import org.chromium.components.autofill_assistant.AutofillAssistantActionHandlerImpl; import org.chromium.components.autofill_assistant.AutofillAssistantDirectAction; +import org.chromium.components.autofill_assistant.AutofillAssistantDirectActionImpl; import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntry; import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntryProvider; +import org.chromium.components.autofill_assistant.onboarding.OnboardingCoordinatorFactory; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 85602c3..e020bd5 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -198,6 +198,7 @@ "//chrome/browser/browser_controls/android:java", "//chrome/browser/endpoint_fetcher:java", "//chrome/browser/feature_engagement:java", + "//chrome/browser/feed/android:java", "//chrome/browser/feedback/android:java", "//chrome/browser/flags:java", "//chrome/browser/lens:java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java index 564515e2..4e3ef47 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tasks; +import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.graphics.PorterDuff; @@ -28,6 +29,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.FeatureList; +import org.chromium.chrome.browser.feed.FeedStreamViewResizer; import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; @@ -37,7 +39,6 @@ import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.widget.CoordinatorLayoutForPointer; import org.chromium.components.browser_ui.widget.displaystyle.UiConfig; -import org.chromium.components.browser_ui.widget.displaystyle.ViewResizer; import org.chromium.components.content_settings.CookieControlsEnforcement; import org.chromium.ui.base.WindowAndroid; @@ -421,13 +422,15 @@ /** * Make the padding of header consistent with that of Feed recyclerview which is sized by {@link - * ViewResizer} in {@link FeedSurfaceCoordinator} + * FeedStreamViewResizer} in {@link FeedSurfaceCoordinator} */ private void setHeaderPadding() { - int defaultPadding = 0; + int defaultPadding = getResources().getDimensionPixelSize( + org.chromium.chrome.R.dimen.content_suggestions_card_modern_margin); int widePadding = getResources().getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins); - ViewResizer.createAndAttach(mHeaderView, mUiConfig, defaultPadding, widePadding); + FeedStreamViewResizer.createAndAttach( + (Activity) mContext, mHeaderView, mUiConfig, defaultPadding, widePadding); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java index 0bef90c..cf6b2a3b 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java
@@ -108,7 +108,7 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { mSnackbarManager.dismissSnackbars(UndoGroupSnackbarController.this); } };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 9f9ced15..cb9511eb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -587,7 +587,7 @@ mTabModelObserver = new TabModelSelectorTabModelObserver(mTabModelSelector) { @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { closeIfNoTabsAndHomepageEnabled(false); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java index 8073795..8ae4befa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -223,8 +223,8 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { - tabClosed(tabId, incognito, false); + public void didCloseTab(Tab tab) { + tabClosed(tab.getId(), tab.isIncognito(), false); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java index eb5654b..8e718b1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -526,8 +526,8 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { - getStripLayoutHelper(incognito).tabClosed(time(), tabId); + public void didCloseTab(Tab tab) { + getStripLayoutHelper(tab.isIncognito()).tabClosed(time(), tab.getId()); updateModelSwitcherButton(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java index 17e3b589..8482073 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrar.java
@@ -124,7 +124,7 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { // We don't need to remove the Tab Observers since it's closed. // TODO(peconn): Do we really want to remove the *global* PageLoadMetrics observers here? removePageLoadMetricsObservers();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java index d0dd988..d4e6847 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -822,8 +822,8 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { - Profile profile = mTabModelSelector.getModel(incognito).getProfile(); + public void didCloseTab(Tab tab) { + Profile profile = mTabModelSelector.getModel(tab.isIncognito()).getProfile(); OfflinePageBridge bridge = OfflinePageBridge.getForProfile(profile); if (bridge == null) return; @@ -831,7 +831,7 @@ // the UI will no longer show the page, and the page would also be cleaned up by GC // given enough time. ClientId clientId = - new ClientId(OfflinePageBridge.LAST_N_NAMESPACE, Integer.toString(tabId)); + new ClientId(OfflinePageBridge.LAST_N_NAMESPACE, Integer.toString(tab.getId())); List<ClientId> clientIds = new ArrayList<>(); clientIds.add(clientId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index c26e7e5..f7bbfd56 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -655,7 +655,6 @@ mTabContentManager.removeTabThumbnail(tab.getId()); for (TabModelObserver obs : mObservers) obs.didCloseTab(tab); - for (TabModelObserver obs : mObservers) obs.didCloseTab(tab.getId(), tab.isIncognito()); if (notifyTabClosureCommitted) { for (TabModelObserver obs : mObservers) obs.tabClosureCommitted(tab); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java index 3fb12c81..b0c0170 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java
@@ -53,10 +53,10 @@ } @Override - public final void didCloseTab(int tabId, boolean incognito) { + public final void didCloseTab(Tab tab) { assert mNativeTabModelObserverJniBridge != 0; - TabModelObserverJniBridgeJni.get().didCloseTab( - mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tabId, incognito); + TabModelObserverJniBridgeJni.get().didCloseTab(mNativeTabModelObserverJniBridge, + TabModelObserverJniBridge.this, tab.getId(), tab.isIncognito()); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java index be1423e9..f2d8bb7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/EmptyBackgroundViewWrapper.java
@@ -84,7 +84,7 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { updateEmptyContainerState(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java index 566bf05..88df6cb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java
@@ -31,7 +31,6 @@ import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisableIf; -import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.R; import org.chromium.chrome.browser.autofill.settings.AutofillPaymentMethodsFragment; import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTabsFragment; @@ -478,7 +477,6 @@ @Test @MediumTest @EnableFeatures("OmniboxPedalsAndroidBatch1") - @DisabledTest(message = "crbug.com/1300291") public void testPedalsStartedOnCtrlEnterKeyStroke() throws InterruptedException { mOmniboxUtils.requestFocus(); mOmniboxUtils.typeText("Chrome accessibility", false); @@ -490,10 +488,10 @@ // Select Pedal with the TAB key and activate it with an ENTER key. mOmniboxUtils.sendKey(KeyEvent.KEYCODE_TAB); - mOmniboxUtils.sendKey(KeyEvent.KEYCODE_ENTER); SettingsActivity settingsActivity = ActivityTestUtils.waitForActivity( - InstrumentationRegistry.getInstrumentation(), SettingsActivity.class, () -> {}); + InstrumentationRegistry.getInstrumentation(), SettingsActivity.class, + () -> { mOmniboxUtils.sendKey(KeyEvent.KEYCODE_ENTER); }); Assert.assertNotNull("Could not find the Settings activity", settingsActivity); checkSettingsWasShownAndOmniboxNoFocus(settingsActivity, AccessibilitySettings.class);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java index bf99001..1c2dd01f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.homepage.settings.HomepageSettings; import org.chromium.chrome.browser.settings.SettingsActivity; import org.chromium.chrome.browser.settings.SettingsActivityTestRule; +import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabList; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelObserver; @@ -163,7 +164,7 @@ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { tabModel.addObserver(new TabModelObserver() { @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { if (tabModel.getCount() == 0) tabClosed.notifyCalled(); } });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/AutomaticEmbargoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/AutomaticEmbargoTest.java index 9152324e..4802301a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/AutomaticEmbargoTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/AutomaticEmbargoTest.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.permissions; -import android.os.Build.VERSION_CODES; import android.support.test.InstrumentationRegistry; import androidx.test.filters.LargeTest; @@ -15,9 +14,7 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.permissions.PermissionTestRule.PermissionUpdateWaiter; import org.chromium.chrome.browser.tab.Tab; @@ -80,10 +77,6 @@ @Test @LargeTest @Feature({"Location"}) - @DisableIf. - Build(message = "Test is failing on Nexus 5X (64-bit) + Android M, see crbug.com/1111001.", - sdk_is_greater_than = VERSION_CODES.LOLLIPOP_MR1, sdk_is_less_than = VERSION_CODES.N, - supported_abis_includes = "arm64-v8a") public void testGeolocationEmbargo() throws Exception { LocationSettingsTestUtil.setSystemLocationSettingEnabled(true); LocationProviderOverrider.setLocationProviderImpl(new MockLocationProvider()); @@ -101,7 +94,6 @@ @Test @LargeTest @Feature({"MIDI"}) - @FlakyTest(message = "crbug.com/1232946") public void testMIDIEmbargo() throws Exception { runTest(MIDI_TEST_FILE, "", "fail", 0); } @@ -109,11 +101,8 @@ @Test @LargeTest @Feature({"MediaPermissions"}) - @DisableIf.Build(message = "Failing on Android P, see crbug.com/1251332.", - sdk_is_greater_than = VERSION_CODES.O_MR1) @CommandLineFlags.Add({ContentSwitches.USE_FAKE_DEVICE_FOR_MEDIA_STREAM}) - public void - testCameraEmbargo() throws Exception { + public void testCameraEmbargo() throws Exception { runTest(MEDIA_TEST_FILE, "initiate_getMicrophone()", "deny", 0); } @@ -121,21 +110,15 @@ @LargeTest @Feature({"MediaPermissions"}) @CommandLineFlags.Add({ContentSwitches.USE_FAKE_DEVICE_FOR_MEDIA_STREAM}) - @DisableIf.Build(message = "Failing on Android P, see crbug.com/1251332.", - sdk_is_greater_than = VERSION_CODES.O_MR1) - public void - testMicrophoneEmbargo() throws Exception { + public void testMicrophoneEmbargo() throws Exception { runTest(MEDIA_TEST_FILE, "initiate_getCamera()", "deny", 0); } @Test @LargeTest @Feature({"MediaPermissions"}) - @DisableIf.Build(message = "Failing on Android P, see crbug.com/1251332.", - sdk_is_greater_than = VERSION_CODES.O_MR1) @CommandLineFlags.Add({ContentSwitches.USE_FAKE_DEVICE_FOR_MEDIA_STREAM}) - public void - testMicrophoneAndCameraEmbargo() throws Exception { + public void testMicrophoneAndCameraEmbargo() throws Exception { runTest(MEDIA_TEST_FILE, "initiate_getCombined()", "deny", 0); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java index 76fa88a..bb05f0bf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
@@ -312,7 +312,7 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { mTabClosedCallback.notifyCalled(); } }
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index a4e30d7..ed48d8c 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -4930,6 +4930,7 @@ "//ash/components/settings", "//ash/public/cpp", "//ash/public/cpp/external_arc", + "//ash/services/cellular_setup", "//ash/services/multidevice_setup", "//ash/services/multidevice_setup/public/cpp:first_run_field_trial", "//ash/services/multidevice_setup/public/mojom", @@ -4977,7 +4978,6 @@ "//chromeos/services/assistant/public/cpp", "//chromeos/services/bluetooth_config", "//chromeos/services/bluetooth_config/public/mojom", - "//chromeos/services/cellular_setup", "//chromeos/services/cros_healthd/public/cpp", "//chromeos/services/cros_healthd/public/mojom", "//chromeos/services/device_sync/public/cpp:prefs", @@ -5186,8 +5186,6 @@ "lacros/chrome_browser_main_extra_parts_lacros.h", "lacros/client_cert_store_lacros.cc", "lacros/client_cert_store_lacros.h", - "lacros/crosapi_pref_observer.cc", - "lacros/crosapi_pref_observer.h", "lacros/device_settings_lacros.cc", "lacros/device_settings_lacros.h", "lacros/download_controller_client_lacros.cc", @@ -6251,6 +6249,14 @@ ] } + if (is_win || is_mac || is_linux || is_chromeos) { + deps += [ + "//components/user_notes:features", + "//components/user_notes/browser", + "//components/user_notes/model", + ] + } + if (enable_click_to_call) { sources += [ "sharing/click_to_call/click_to_call_utils.cc",
diff --git a/chrome/browser/android/autofill_assistant/assistant_bottom_bar_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_bottom_bar_delegate.cc index 76ea8b8..d7a8cb1 100644 --- a/chrome/browser/android/autofill_assistant/assistant_bottom_bar_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_bottom_bar_delegate.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/android/autofill_assistant/assistant_bottom_bar_delegate.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantBottomBarNativeDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantBottomBarNativeDelegate_jni.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc index 7ceec42..779f1f5 100644 --- a/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc
@@ -10,10 +10,10 @@ #include "base/android/jni_string.h" #include "base/android/locale_utils.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantCollectUserDataNativeDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" #include "components/autofill/core/browser/autofill_data_util.h" +#include "components/autofill_assistant/android/jni_headers/AssistantCollectUserDataNativeDelegate_jni.h" using base::android::AttachCurrentThread; using base::android::JavaParamRef;
diff --git a/chrome/browser/android/autofill_assistant/assistant_form_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_form_delegate.cc index ce8cf6a..a6049dd 100644 --- a/chrome/browser/android/autofill_assistant/assistant_form_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_form_delegate.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/android/autofill_assistant/assistant_form_delegate.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantFormDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantFormDelegate_jni.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/autofill_assistant/assistant_generic_ui_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_generic_ui_delegate.cc index 3f80cd06..a4ac082 100644 --- a/chrome/browser/android/autofill_assistant/assistant_generic_ui_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_generic_ui_delegate.cc
@@ -6,9 +6,9 @@ #include "base/android/jni_string.h" #include "base/strings/string_number_conversions.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantGenericUiDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" +#include "components/autofill_assistant/android/jni_headers/AssistantGenericUiDelegate_jni.h" #include "components/autofill_assistant/browser/service.pb.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/autofill_assistant/assistant_header_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_header_delegate.cc index d9c600a9..a99e7ab 100644 --- a/chrome/browser/android/autofill_assistant/assistant_header_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_header_delegate.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/android/autofill_assistant/assistant_header_delegate.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantHeaderDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantHeaderDelegate_jni.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/autofill_assistant/assistant_header_model.cc b/chrome/browser/android/autofill_assistant/assistant_header_model.cc index 7bce6c43..6ff897a 100644 --- a/chrome/browser/android/autofill_assistant/assistant_header_model.cc +++ b/chrome/browser/android/autofill_assistant/assistant_header_model.cc
@@ -5,10 +5,10 @@ #include "chrome/browser/android/autofill_assistant/assistant_header_model.h" #include "base/android/jni_string.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantHeaderModel_jni.h" #include "chrome/browser/android/autofill_assistant/dependencies.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" +#include "components/autofill_assistant/android/jni_headers/AssistantHeaderModel_jni.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/autofill_assistant/assistant_overlay_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_overlay_delegate.cc index 9d594f7a..8c15e147 100644 --- a/chrome/browser/android/autofill_assistant/assistant_overlay_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_overlay_delegate.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/android/autofill_assistant/assistant_overlay_delegate.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantOverlayDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantOverlayDelegate_jni.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/autofill_assistant/client_android.cc b/chrome/browser/android/autofill_assistant/client_android.cc index 51bec337..2ace8dd 100644 --- a/chrome/browser/android/autofill_assistant/client_android.cc +++ b/chrome/browser/android/autofill_assistant/client_android.cc
@@ -18,11 +18,11 @@ #include "base/json/json_writer.h" #include "base/metrics/field_trial_params.h" #include "base/time/default_tick_clock.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AutofillAssistantClient_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AutofillAssistantDirectActionImpl_jni.h" #include "chrome/browser/android/autofill_assistant/annotate_dom_model_service_factory.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" #include "chrome/browser/password_manager/password_change_success_tracker_factory.h" +#include "components/autofill_assistant/android/jni_headers/AutofillAssistantClient_jni.h" +#include "components/autofill_assistant/android/jni_headers/AutofillAssistantDirectActionImpl_jni.h" #include "components/autofill_assistant/browser/autofill_assistant_tts_controller.h" #include "components/autofill_assistant/browser/controller.h" #include "components/autofill_assistant/browser/display_strings_util.h" @@ -316,7 +316,7 @@ // Prepare the java array to hold the direct actions. base::android::ScopedJavaLocalRef<jclass> directaction_array_class = base::android::GetClass(env, - "org/chromium/chrome/browser/autofill_assistant/" + "org/chromium/components/autofill_assistant/" "AutofillAssistantDirectActionImpl", "autofill_assistant");
diff --git a/chrome/browser/android/autofill_assistant/generic_ui_events_android.cc b/chrome/browser/android/autofill_assistant/generic_ui_events_android.cc index 543352b..1a9ee6f 100644 --- a/chrome/browser/android/autofill_assistant/generic_ui_events_android.cc +++ b/chrome/browser/android/autofill_assistant/generic_ui_events_android.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/android/autofill_assistant/generic_ui_events_android.h" #include "base/android/jni_string.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantViewEvents_jni.h" #include "chrome/browser/android/autofill_assistant/view_handler_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantViewEvents_jni.h" namespace autofill_assistant { namespace android_events {
diff --git a/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc b/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc index a6a4da3..e38aefd 100644 --- a/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc +++ b/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc
@@ -5,9 +5,9 @@ #include "chrome/browser/android/autofill_assistant/generic_ui_interactions_android.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantViewInteractions_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" #include "chrome/browser/android/autofill_assistant/view_handler_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantViewInteractions_jni.h" #include "components/autofill_assistant/browser/radio_button_controller.h" #include "components/autofill_assistant/browser/user_model.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/chrome/browser/android/autofill_assistant/generic_ui_nested_controller_android.cc b/chrome/browser/android/autofill_assistant/generic_ui_nested_controller_android.cc index eae19cb..92cfd1d5 100644 --- a/chrome/browser/android/autofill_assistant/generic_ui_nested_controller_android.cc +++ b/chrome/browser/android/autofill_assistant/generic_ui_nested_controller_android.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/android/autofill_assistant/generic_ui_nested_controller_android.h" #include "base/android/jni_string.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantViewFactory_jni.h" #include "chrome/browser/android/autofill_assistant/assistant_generic_ui_delegate.h" #include "chrome/browser/android/autofill_assistant/dependencies.h" #include "chrome/browser/android/autofill_assistant/generic_ui_events_android.h" @@ -13,6 +12,7 @@ #include "chrome/browser/android/autofill_assistant/interaction_handler_android.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" #include "chrome/browser/android/autofill_assistant/view_handler_android.h" +#include "components/autofill_assistant/android/jni_headers/AssistantViewFactory_jni.h" #include "components/autofill_assistant/browser/event_handler.h" #include "components/autofill_assistant/browser/field_formatter.h" #include "components/autofill_assistant/browser/generic_ui_java_generated_enums.h"
diff --git a/chrome/browser/android/autofill_assistant/onboarding_coordinator_bridge.cc b/chrome/browser/android/autofill_assistant/onboarding_coordinator_bridge.cc index 5d18c8a..8d75e15 100644 --- a/chrome/browser/android/autofill_assistant/onboarding_coordinator_bridge.cc +++ b/chrome/browser/android/autofill_assistant/onboarding_coordinator_bridge.cc
@@ -6,8 +6,8 @@ #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" #include "base/containers/flat_map.h" -#include "chrome/android/features/autofill_assistant/jni_headers/BaseOnboardingCoordinator_jni.h" #include "chrome/browser/android/autofill_assistant/onboarding_fetcher_factory.h" +#include "components/autofill_assistant/android/jni_headers/BaseOnboardingCoordinator_jni.h" #include "components/autofill_assistant/browser/autofill_assistant_onboarding_fetcher.h" namespace autofill_assistant {
diff --git a/chrome/browser/android/autofill_assistant/starter_delegate_android.cc b/chrome/browser/android/autofill_assistant/starter_delegate_android.cc index f91fae0..719e7c3 100644 --- a/chrome/browser/android/autofill_assistant/starter_delegate_android.cc +++ b/chrome/browser/android/autofill_assistant/starter_delegate_android.cc
@@ -9,10 +9,10 @@ #include "base/android/scoped_java_ref.h" #include "base/notreached.h" #include "base/time/default_tick_clock.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantOnboardingHelperImpl_jni.h" #include "chrome/browser/android/autofill_assistant/client_android.h" #include "chrome/browser/android/autofill_assistant/trigger_script_bridge_android.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" +#include "components/autofill_assistant/android/jni_headers/AssistantOnboardingHelperImpl_jni.h" #include "components/autofill_assistant/android/jni_headers_public/Starter_jni.h" #include "components/autofill_assistant/browser/assistant_field_trial_util.h" #include "components/autofill_assistant/browser/public/runtime_manager_impl.h"
diff --git a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc index c425c6a..ee00a10a 100644 --- a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc +++ b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc
@@ -6,10 +6,10 @@ #include "base/android/jni_array.h" #include "base/android/jni_string.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantTriggerScriptBridge_jni.h" #include "chrome/browser/android/autofill_assistant/assistant_header_model.h" #include "chrome/browser/android/autofill_assistant/dependencies.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" +#include "components/autofill_assistant/android/jni_headers/AssistantTriggerScriptBridge_jni.h" using base::android::AttachCurrentThread; using base::android::JavaParamRef;
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.cc b/chrome/browser/android/autofill_assistant/ui_controller_android.cc index bd8a1796..fd5997b 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android.cc +++ b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
@@ -17,24 +17,24 @@ #include "base/metrics/field_trial_params.h" #include "base/task/post_task.h" #include "base/time/time.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantCollectUserDataModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantDetailsModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantDetails_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantFormInput_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantFormModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantGenericUiModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantInfoBoxModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantInfoBox_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantOverlayModel_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantPlaceholdersConfiguration_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AutofillAssistantUiController_jni.h" #include "chrome/browser/android/autofill_assistant/client_android.h" #include "chrome/browser/android/autofill_assistant/dependencies.h" #include "chrome/browser/android/autofill_assistant/generic_ui_root_controller_android.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" #include "components/autofill/core/browser/data_model/autofill_profile.h" #include "components/autofill/core/browser/data_model/credit_card.h" +#include "components/autofill_assistant/android/jni_headers/AssistantCollectUserDataModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantDetailsModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantDetails_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantFormInput_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantFormModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantGenericUiModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantInfoBoxModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantInfoBox_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantOverlayModel_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantPlaceholdersConfiguration_jni.h" +#include "components/autofill_assistant/android/jni_headers/AutofillAssistantUiController_jni.h" #include "components/autofill_assistant/browser/bottom_sheet_state.h" #include "components/autofill_assistant/browser/client_settings.h" #include "components/autofill_assistant/browser/controller.h"
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc b/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc index ff46cba..fcb2096b 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc +++ b/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc
@@ -12,18 +12,18 @@ #include "base/base64.h" #include "base/containers/flat_map.h" #include "base/notreached.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantChip_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantColor_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantDateTime_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantDialogButton_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantDimension_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantDrawable_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantInfoPopup_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AssistantValue_jni.h" -#include "chrome/android/features/autofill_assistant/jni_headers/AutofillAssistantDependencyInjector_jni.h" #include "chrome/browser/android/autofill_assistant/client_android.h" #include "chrome/browser/android/autofill_assistant/dependencies.h" #include "components/autofill/core/browser/autofill_data_util.h" +#include "components/autofill_assistant/android/jni_headers/AssistantChip_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantColor_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantDateTime_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantDialogButton_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantDimension_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantDrawable_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantInfoPopup_jni.h" +#include "components/autofill_assistant/android/jni_headers/AssistantValue_jni.h" +#include "components/autofill_assistant/android/jni_headers/AutofillAssistantDependencyInjector_jni.h" #include "components/autofill_assistant/android/jni_headers_public/AssistantAutofillCreditCard_jni.h" #include "components/autofill_assistant/android/jni_headers_public/AssistantAutofillProfile_jni.h" #include "components/autofill_assistant/browser/generic_ui_java_generated_enums.h"
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 0c203356..a567889d 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -898,8 +898,7 @@ return; } - StartupBrowserCreator::MaybeHandleProfileAgnosticUrls( - urls, base::BindOnce(&OpenUrlsInBrowser, urls)); + OpenUrlsInBrowser(urls); } // This is called after profiles have been loaded and preferences registered.
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm index 35fc483..88fdabb 100644 --- a/chrome/browser/app_controller_mac_browsertest.mm +++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -51,14 +51,9 @@ #include "chrome/browser/ui/cocoa/test/run_loop_testing.h" #include "chrome/browser/ui/profile_picker.h" #include "chrome/browser/ui/search/ntp_test_utils.h" -#include "chrome/browser/ui/startup/web_app_url_handling_startup_test_utils.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/ui_features.h" -#include "chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h" -#include "chrome/browser/ui/web_applications/app_browser_controller.h" #include "chrome/browser/ui/webui/welcome/helpers.h" -#include "chrome/browser/web_applications/os_integration/url_handler_manager_impl.h" -#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" @@ -70,13 +65,11 @@ #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/prefs/pref_service.h" -#include "components/services/app_service/public/cpp/url_handler_info.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" -#include "content/public/test/test_utils.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/common/extension.h" @@ -89,7 +82,6 @@ #include "ui/views/widget/widget.h" using base::SysUTF16ToNSString; -using web_app::StartupBrowserWebAppUrlHandlingTest; @interface AppController (ForTesting) - (void)getUrl:(NSAppleEventDescriptor*)event @@ -189,20 +181,6 @@ base::RunLoop run_loop_; }; -// Check that there are two browsers. Find the one that is not |browser|. -Browser* FindOneOtherBrowser(Browser* browser) { - // There should only be one other browser. - EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile())); - - // Find the new browser. - Browser* other_browser = nullptr; - for (auto* b : *BrowserList::GetInstance()) { - if (b != browser) - other_browser = b; - } - return other_browser; -} - } // namespace @interface TestOpenShortcutOnStartup : NSObject @@ -1068,335 +1046,6 @@ EXPECT_EQ(profile, new_browser->profile()->GetOriginalProfile()); } -// URL Handling tests. -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogCancelled_NoLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Start URL is in app scope. - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - - // The waiter will get the dialog when it shows up and close it. - waiter.WaitIfNeededAndGet()->CloseWithReason( - views::Widget::ClosedReason::kEscKeyPressed); - - // When dialog is closed, nothing will happen. - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_BrowserLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Select the first choice, which is the browser. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 0); - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - TabStripModel* tab_strip = browser()->tab_strip_model(); - ASSERT_EQ(2, tab_strip->count()); - // Check the link of the new tab that was opened. - content::WebContents* web_contents = tab_strip->GetWebContentsAt(1); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_RememberBrowserLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - base::HistogramTester histogram_tester; - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Get matches before dialog launch. - auto url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(GURL(start_url)); - - // Select and remember the first choice, which is the browser. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_REMEMBER_OPTION, 0); - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState:: - kBrowserAcceptedAndRememberChoice, - 1); - - // When dialog is closed, URL will be launched in a browser tab. - // Check for new tab. - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - TabStripModel* tab_strip = browser()->tab_strip_model(); - ASSERT_EQ(2, tab_strip->count()); - // Check the link of the new tab that was opened. - content::WebContents* web_contents = tab_strip->GetWebContentsAt(1); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); - - // Get matches after dialog is closed. - auto new_url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(GURL(start_url)); - ASSERT_NE(url_handler_matches, new_url_handler_matches); - // Verify opening in browser is saved as the default choice (i.e. no matches - // found). - ASSERT_TRUE(new_url_handler_matches.empty()); - - // Start with the same URL again. A new tab should be opened directly. - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - // Verify a new tab is launched. - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - tab_strip = browser()->tab_strip_model(); - ASSERT_EQ(3, tab_strip->count()); - // Check the link of the new tab that was opened. - web_contents = tab_strip->GetWebContentsAt(2); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); - - // Dialog wasn't shown, the total count of dialog state stays the same. - histogram_tester.ExpectTotalCount("WebApp.UrlHandling.DialogState", 1); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_RememberWebAppLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - base::HistogramTester histogram_tester; - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Get matches before dialog launch. - auto url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(GURL(start_url)); - - // Select and remember the second choice, which is the app. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_REMEMBER_OPTION, 1); - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState:: - kAppAcceptedAndRememberChoice, - 1); - - // Check for new app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - Browser* app_browser; - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); - - // Get matches after dialog is closed. - auto new_url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(GURL(start_url)); - ASSERT_NE(url_handler_matches, new_url_handler_matches); - - // Close the app window and start with the same URL again. App should be - // launched directly. - CloseBrowserSynchronously(app_browser); - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - ui_test_utils::WaitForBrowserToOpen(); - // Verify app window is launched. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - // Dialog wasn't shown, the total count of dialog state stays the same. - histogram_tester.ExpectTotalCount("WebApp.UrlHandling.DialogState", 1); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_WebAppLaunch_InScopeUrl) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Select the second choice, which is the app. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 1); - // start_url is in app scope. - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // Check for new app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - Browser* app_browser; - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_WebAppLaunch_DifferentOriginUrl) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL("https://example.com")); - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Select the second choice, which is the app. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 1); - - // URL is not in app scope but matches url_handlers of installed app. - GURL target_url = GURL("https://example.com/abc/def"); - ASSERT_TRUE(target_url.is_valid()); - SendAppleEventToOpenUrlToAppController(target_url); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // Check for new app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - Browser* app_browser; - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - // Out-of-scope URL launch should open new app window and navigate to the - // out-of-scope URL. - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(target_url, web_contents->GetVisibleURL()); -} - -IN_PROC_BROWSER_TEST_F( - StartupBrowserWebAppUrlHandlingTest, - MultipleProfiles_DialogAccepted_WebAppLaunch_InScopeUrl) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - // Create profiles and install URL Handling apps. - ProfileManager* profile_manager = g_browser_process->profile_manager(); - base::FilePath dest_path = profile_manager->user_data_dir(); - Profile* profile1 = nullptr; - Profile* profile2 = nullptr; - { - base::ScopedAllowBlockingForTesting allow_blocking; - profile1 = profile_manager->GetProfile( - dest_path.Append(FILE_PATH_LITERAL("New Profile 1"))); - ASSERT_TRUE(profile1); - - profile2 = profile_manager->GetProfile( - dest_path.Append(FILE_PATH_LITERAL("New Profile 2"))); - ASSERT_TRUE(profile2); - } - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id_1 = web_app::test::InstallWebAppWithUrlHandlers( - profile1, GURL(start_url), app_name, {url_handler}); - web_app::AppId app_id_2 = web_app::test::InstallWebAppWithUrlHandlers( - profile2, GURL(start_url), app_name, {url_handler}); - - // Test that we should be able to select the 3rd option. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 2); - // start_url is in app scope for both apps. - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // There should be one app window. No deterministic ordering of apps, so find - // which profile app is launched. - ASSERT_EQ(1u, chrome::GetBrowserCount(profile1) + - chrome::GetBrowserCount(profile2)); - Profile* app_profile = - (chrome::GetBrowserCount(profile1) == 1) ? profile1 : profile2; - Browser* app_browser = chrome::FindBrowserWithProfile(app_profile); - ASSERT_TRUE(app_browser); - ASSERT_TRUE( - web_app::AppBrowserController::IsForWebApp(app_browser, app_id_1) || - web_app::AppBrowserController::IsForWebApp(app_browser, app_id_2)); - - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - CheckHistogramsFired) { - base::HistogramTester histogram_tester; - - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - SendAppleEventToOpenUrlToAppController(GURL(start_url)); - - // The waiter will get the dialog when it shows up and close it. - waiter.WaitIfNeededAndGet()->CloseWithReason( - views::Widget::ClosedReason::kEscKeyPressed); - - histogram_tester.ExpectTotalCount( - "WebApp.UrlHandling.GetValidProfilesAtStartUp", 1); - histogram_tester.ExpectTotalCount( - "WebApp.UrlHandling.LoadWebAppRegistrarsAtStartUp", 1); - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState::kClosed, 1); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, UrlNotCaptured) { - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL("https://example.com")); - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // This URL is not in scope of installed app and does not match url_handlers. - SendAppleEventToOpenUrlToAppController( - GURL("https://en.example.com/abc/def")); - - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - TabStripModel* tab_strip = browser()->tab_strip_model(); - ASSERT_EQ(2, tab_strip->count()); - // Check the link of the new tab that was opened. - content::WebContents* web_contents = tab_strip->GetWebContentsAt(1); - EXPECT_EQ(GURL("https://en.example.com/abc/def"), - web_contents->GetVisibleURL()); -} - class AppControllerIncognitoSwitchTest : public InProcessBrowserTest { public: void SetUpCommandLine(base::CommandLine* command_line) override {
diff --git a/chrome/browser/ash/accessibility/accessibility_extension_channel_browsertest.cc b/chrome/browser/ash/accessibility/accessibility_extension_channel_browsertest.cc new file mode 100644 index 0000000..e22782c1 --- /dev/null +++ b/chrome/browser/ash/accessibility/accessibility_extension_channel_browsertest.cc
@@ -0,0 +1,103 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/accessibility/accessibility_manager.h" +#include "chrome/browser/ash/accessibility/accessibility_test_utils.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/common/extensions/extension_constants.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "components/version_info/channel.h" +#include "content/public/test/browser_test.h" +#include "extensions/browser/extension_host_test_helper.h" +#include "extensions/common/constants.h" +#include "extensions/common/features/feature_channel.h" + +namespace ash { + +namespace { + +void EnableSpokenFeedback() { + AccessibilityManager::Get()->EnableSpokenFeedback(true); +} + +bool IsSpokenFeedbackEnabled() { + return AccessibilityManager::Get()->IsSpokenFeedbackEnabled(); +} + +void EnableSwitchAccess() { + AccessibilityManager::Get()->SetSwitchAccessEnabled(true); +} + +bool IsSwitchAccessEnabled() { + return AccessibilityManager::Get()->IsSwitchAccessEnabled(); +} + +void EnableSelectToSpeak() { + AccessibilityManager::Get()->SetSelectToSpeakEnabled(true); +} + +bool IsSelectToSpeakEnabled() { + return AccessibilityManager::Get()->IsSelectToSpeakEnabled(); +} + +} // namespace + +class AccessibilityExtensionChannelTest + : public InProcessBrowserTest, + public testing::WithParamInterface<version_info::Channel> { + protected: + AccessibilityExtensionChannelTest() : channel_(GetParam()) {} + ~AccessibilityExtensionChannelTest() = default; + AccessibilityExtensionChannelTest(const AccessibilityExtensionChannelTest&) = + delete; + AccessibilityExtensionChannelTest& operator=( + const AccessibilityExtensionChannelTest&) = delete; + + void LoadExtensionAndPerformChecks( + const char* extension_id, + base::OnceCallback<void()> enable_extension, + base::OnceCallback<bool()> is_extension_enabled) { + ExtensionConsoleErrorObserver console_observer(browser()->profile(), + extension_id); + extensions::ExtensionHostTestHelper host_helper(browser()->profile(), + extension_id); + std::move(enable_extension).Run(); + host_helper.WaitForHostCompletedFirstLoad(); + EXPECT_TRUE(std::move(is_extension_enabled).Run()); + EXPECT_FALSE(console_observer.HasErrorsOrWarnings()) + << "Found console.warn or console.error with message: " + << console_observer.GetErrorOrWarningAt(0); + } + + private: + extensions::ScopedCurrentChannel channel_; +}; + +INSTANTIATE_TEST_SUITE_P(Channels, + AccessibilityExtensionChannelTest, + testing::Values(version_info::Channel::STABLE, + version_info::Channel::BETA, + version_info::Channel::DEV, + version_info::Channel::CANARY, + version_info::Channel::DEFAULT)); + +IN_PROC_BROWSER_TEST_P(AccessibilityExtensionChannelTest, ChromeVox) { + LoadExtensionAndPerformChecks(extension_misc::kChromeVoxExtensionId, + base::BindOnce(&EnableSpokenFeedback), + base::BindOnce(&IsSpokenFeedbackEnabled)); +} + +IN_PROC_BROWSER_TEST_P(AccessibilityExtensionChannelTest, SwitchAccess) { + LoadExtensionAndPerformChecks(extension_misc::kSwitchAccessExtensionId, + base::BindOnce(&EnableSwitchAccess), + base::BindOnce(&IsSwitchAccessEnabled)); +} + +IN_PROC_BROWSER_TEST_P(AccessibilityExtensionChannelTest, SelectToSpeak) { + LoadExtensionAndPerformChecks(extension_misc::kSelectToSpeakExtensionId, + base::BindOnce(&EnableSelectToSpeak), + base::BindOnce(&IsSelectToSpeakEnabled)); +} + +} // namespace ash
diff --git a/chrome/browser/ash/app_restore/arc_window_handler.cc b/chrome/browser/ash/app_restore/arc_window_handler.cc index fb0ad82..73160e0 100644 --- a/chrome/browser/ash/app_restore/arc_window_handler.cc +++ b/chrome/browser/ash/app_restore/arc_window_handler.cc
@@ -57,7 +57,13 @@ lifetime_manager->AddObserver(this); } -ArcWindowHandler::~ArcWindowHandler() = default; +ArcWindowHandler::~ArcWindowHandler() { + if (exo::WMHelper::HasInstance()) { + auto* lifetime_manager = exo::WMHelper::GetInstance()->GetLifetimeManager(); + if (lifetime_manager) + lifetime_manager->RemoveObserver(this); + } +} void ArcWindowHandler::OnDestroyed() { // Destroy all ARC ghost window when Wayland server shutdown.
diff --git a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc index 290e373..da87362 100644 --- a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc +++ b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc
@@ -275,18 +275,25 @@ void ArcScreenCaptureSession::QueryCompleted( GLuint query_id, + std::unique_ptr<DesktopTexture> desktop_texture, std::unique_ptr<PendingBuffer> pending_buffer) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // Notify ARC++ that the buffer is ready. - std::move(pending_buffer->callback_).Run(); - gpu::gles2::GLES2Interface* gl = GetContextProvider()->ContextGL(); if (!gl) { LOG(ERROR) << "Unable to get the GL context"; return; } + // Return CopyOutputResult resources after texture copy happens. + gl->DeleteTextures(1, &desktop_texture->texture_); + gpu::SyncToken sync_token; + gl->GenSyncTokenCHROMIUM(sync_token.GetData()); + std::move(desktop_texture->release_callback_).Run(sync_token, false); + + // Notify ARC++ that the buffer is ready. + std::move(pending_buffer->callback_).Run(); + // Return resources for ARC++ buffer. The GpuMemoryBuffer will go out of // scope and be destroyed too. gl->BindTexture(GL_TEXTURE_2D, pending_buffer->texture_); @@ -359,17 +366,10 @@ gfx::Rect(0, 0, size_.width(), size_.height())); gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); - // Return CopyOutputResult resources after texture copy happens. - gl->DeleteTextures(1, &desktop_texture->texture_); - if (desktop_texture->release_callback_) { - gpu::SyncToken sync_token; - gl->GenSyncTokenCHROMIUM(sync_token.GetData()); - std::move(desktop_texture->release_callback_).Run(sync_token, false); - } - context_provider->ContextSupport()->SignalQuery( query_id, base::BindOnce(&ArcScreenCaptureSession::QueryCompleted, weak_ptr_factory_.GetWeakPtr(), query_id, + std::move(desktop_texture), std::move(pending_buffer))); }
diff --git a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.h b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.h index ed95c023..83c7674 100644 --- a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.h +++ b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.h
@@ -99,6 +99,7 @@ void OnDesktopCaptured(std::unique_ptr<viz::CopyOutputResult> result); // Callback for completion of GL commands. void QueryCompleted(GLuint query_id, + std::unique_ptr<DesktopTexture> desktop_texture, std::unique_ptr<PendingBuffer> pending_buffer); // Callback for a user clicking Stop on the notification for screen capture. void NotificationStop();
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc index 93e75eac..6c9c4d0e 100644 --- a/chrome/browser/ash/crosapi/browser_util.cc +++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -49,9 +49,6 @@ absl::optional<bool> g_lacros_primary_browser_for_test; -LacrosLaunchSwitchSource g_lacros_launch_switch_source = - LacrosLaunchSwitchSource::kUnknown; - // At session start the value for LacrosLaunchSwitch logic is applied and the // result is stored in this value which is used after that as a cache. absl::optional<LacrosLaunchSwitch> g_lacros_launch_switch_cache; @@ -120,41 +117,33 @@ // Given a raw policy value, decides what LacrosLaunchSwitch value should be // used as a result of policy application. -std::pair<LacrosLaunchSwitch, LacrosLaunchSwitchSource> -DetermineLacrosLaunchSwitchFromPolicyValue(base::StringPiece policy_value) { +LacrosLaunchSwitch DetermineLacrosLaunchSwitchFromPolicyValue( + base::StringPiece policy_value) { // Users can set this switch in chrome://flags to disable the effect of the // lacros-availability policy. base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(ash::switches::kLacrosAvailabilityIgnore)) { - return std::make_pair(LacrosLaunchSwitch::kUserChoice, - LacrosLaunchSwitchSource::kForcedByUser); - } + if (command_line->HasSwitch(ash::switches::kLacrosAvailabilityIgnore)) + return LacrosLaunchSwitch::kUserChoice; if (policy_value.empty()) { // Some tests call IsLacrosAllowedToBeEnabled but don't have the value set. - return std::make_pair(LacrosLaunchSwitch::kUserChoice, - LacrosLaunchSwitchSource::kPossiblySetByUser); + return LacrosLaunchSwitch::kUserChoice; } auto* map_entry = policy_value_to_enum.find(policy_value); if (map_entry == policy_value_to_enum.end()) { LOG(ERROR) << "Invalid LacrosLaunchSwitch policy value: " << policy_value; - return std::make_pair(LacrosLaunchSwitch::kUserChoice, - LacrosLaunchSwitchSource::kPossiblySetByUser); + return LacrosLaunchSwitch::kUserChoice; } auto result = map_entry->second; if (IsGoogleInternal() && !base::FeatureList::IsEnabled(kLacrosGooglePolicyRollout) && result != LacrosLaunchSwitch::kLacrosDisallowed) { - return std::make_pair(LacrosLaunchSwitch::kUserChoice, - LacrosLaunchSwitchSource::kPossiblySetByUser); + return LacrosLaunchSwitch::kUserChoice; } - return std::make_pair(result, - result == LacrosLaunchSwitch::kUserChoice - ? LacrosLaunchSwitchSource::kPossiblySetByUser - : LacrosLaunchSwitchSource::kForcedByPolicy); + return result; } // Gets called from IsLacrosAllowedToBeEnabled with primary user or from @@ -415,11 +404,9 @@ // Before Policy is initialized, the value won't be available. // So, we'll use the value preserved in the feature flags. // See also LacrosAvailabilityPolicyObserver how it will be propergated. - launch_switch = - DetermineLacrosLaunchSwitchFromPolicyValue( - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - kLacrosAvailabilityPolicySwitch)) - .first; + launch_switch = DetermineLacrosLaunchSwitchFromPolicyValue( + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + kLacrosAvailabilityPolicySwitch)); } else { DCHECK_EQ(policy_init_state, PolicyInitState::kAfterInit); launch_switch = GetLaunchSwitch(); @@ -699,9 +686,8 @@ } const base::Value* value = map.GetValue(policy::key::kLacrosAvailability); - std::tie(g_lacros_launch_switch_cache, g_lacros_launch_switch_source) = - DetermineLacrosLaunchSwitchFromPolicyValue(value ? value->GetString() - : base::StringPiece()); + g_lacros_launch_switch_cache = DetermineLacrosLaunchSwitchFromPolicyValue( + value ? value->GetString() : base::StringPiece()); } ComponentInfo GetLacrosComponentInfo() { @@ -787,7 +773,18 @@ } LacrosLaunchSwitchSource GetLacrosLaunchSwitchSource() { - return g_lacros_launch_switch_source; + if (!g_lacros_launch_switch_cache.has_value()) + return LacrosLaunchSwitchSource::kUnknown; + + // Note: this check needs to be consistent with the one in + // DetermineLacrosLaunchSwitchFromPolicyValue. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(ash::switches::kLacrosAvailabilityIgnore)) + return LacrosLaunchSwitchSource::kForcedByUser; + + return GetLaunchSwitch() == LacrosLaunchSwitch::kUserChoice + ? LacrosLaunchSwitchSource::kPossiblySetByUser + : LacrosLaunchSwitchSource::kForcedByPolicy; } base::StringPiece GetLacrosAvailabilityPolicyName(LacrosLaunchSwitch value) {
diff --git a/chrome/browser/ash/crosapi/browser_util_unittest.cc b/chrome/browser/ash/crosapi/browser_util_unittest.cc index 2d0558b..c0d23d34a 100644 --- a/chrome/browser/ash/crosapi/browser_util_unittest.cc +++ b/chrome/browser/ash/crosapi/browser_util_unittest.cc
@@ -5,10 +5,12 @@ #include "chrome/browser/ash/crosapi/browser_util.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_switches.h" #include "base/containers/fixed_flat_map.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/json/json_reader.h" +#include "base/test/scoped_command_line.h" #include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" @@ -24,6 +26,7 @@ #include "testing/gtest/include/gtest/gtest.h" using crosapi::browser_util::LacrosLaunchSwitch; +using crosapi::browser_util::LacrosLaunchSwitchSource; using crosapi::browser_util::LacrosSelection; using user_manager::User; using version_info::Channel; @@ -727,4 +730,39 @@ } } +TEST_F(BrowserUtilTest, GetLacrosLaunchSwitchSource) { + // If LaunchSwitch is not set, the source is unknown. + EXPECT_EQ(LacrosLaunchSwitchSource::kUnknown, + browser_util::GetLacrosLaunchSwitchSource()); + + // If the policy says UserChoice, lacros state may be set by user. + { + ScopedLacrosLaunchSwitchCache cache(LacrosLaunchSwitch::kUserChoice); + EXPECT_EQ(LacrosLaunchSwitchSource::kPossiblySetByUser, + browser_util::GetLacrosLaunchSwitchSource()); + } + + // The policy can be ignored by command line flag. + // In the case, it is forced by user. Note that if the flag is set, + // LacrosLaunchSwitch is always kUserChoice. + { + ScopedLacrosLaunchSwitchCache cache(LacrosLaunchSwitch::kUserChoice); + base::test::ScopedCommandLine cmd_line; + cmd_line.GetProcessCommandLine()->AppendSwitch( + ash::switches::kLacrosAvailabilityIgnore); + EXPECT_EQ(LacrosLaunchSwitchSource::kForcedByUser, + browser_util::GetLacrosLaunchSwitchSource()); + } + + // Otherwise, the LaunchSwitch is set by the policy. + for (const auto launch_switch : + {LacrosLaunchSwitch::kLacrosDisallowed, LacrosLaunchSwitch::kSideBySide, + LacrosLaunchSwitch::kLacrosPrimary, LacrosLaunchSwitch::kLacrosOnly}) { + ScopedLacrosLaunchSwitchCache cache(launch_switch); + EXPECT_EQ(LacrosLaunchSwitchSource::kForcedByPolicy, + browser_util::GetLacrosLaunchSwitchSource()) + << static_cast<int>(launch_switch); + } +} + } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/prefs_ash.cc b/chrome/browser/ash/crosapi/prefs_ash.cc index f9889ac6..33cf3d778 100644 --- a/chrome/browser/ash/crosapi/prefs_ash.cc +++ b/chrome/browser/ash/crosapi/prefs_ash.cc
@@ -9,12 +9,14 @@ #include "ash/constants/ash_pref_names.h" #include "base/bind.h" #include "base/check.h" +#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" #include "chromeos/crosapi/mojom/prefs.mojom.h" #include "components/metrics/metrics_pref_names.h" #include "components/prefs/pref_service.h" #include "components/user_manager/user_manager.h" +#include "content/public/browser/notification_service.h" namespace crosapi { namespace { @@ -38,6 +40,9 @@ DCHECK(profile_manager_); DCHECK(local_state_); + notification_registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, + content::NotificationService::AllSources()); + profile_manager_->AddObserver(this); local_state_registrar_.Init(local_state_); @@ -49,7 +54,7 @@ PrefsAsh::~PrefsAsh() { // Remove this observer, if the Primary logged in profile is not yet created. // On actual shutdown, the ProfileManager will destruct before CrosapiManager. - if (IsInObserverList() && profile_manager_) { + if (ProfileManagerObserver::IsInObserverList() && profile_manager_) { profile_manager_->RemoveObserver(this); } } @@ -89,6 +94,7 @@ mojo::Remote<mojom::PrefObserver> remote(std::move(observer)); remote->OnPrefChanged(value->Clone()); + DCHECK(state->registrar); if (!state->registrar->IsObserved(state->path)) { // Unretained() is safe since PrefChangeRegistrar and RemoteSet within // observers_ are owned by this and wont invoke if PrefsAsh is destroyed. @@ -118,11 +124,12 @@ return State{local_state_, &local_state_registrar_, metrics::prefs::kMetricsReportingEnabled}; case mojom::PrefPath::kAccessibilitySpokenFeedbackEnabled: - if (!profile_prefs_) { + if (!profile_prefs_registrar_) { LOG(WARNING) << "Primary profile is not yet initialized"; return absl::nullopt; } - return State{profile_prefs_, &profile_prefs_registrar_, + return State{profile_prefs_registrar_->prefs(), + profile_prefs_registrar_.get(), ash::prefs::kAccessibilitySpokenFeedbackEnabled}; case mojom::PrefPath::kDeviceSystemWideTracingEnabled: return State{local_state_, &local_state_registrar_, @@ -143,6 +150,18 @@ profile_manager_ = nullptr; } +void PrefsAsh::OnProfileWillBeDestroyed(Profile* profile) { + profile_observation_.Reset(); + profile_prefs_registrar_.reset(); +} + +void PrefsAsh::Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type); + profile_prefs_registrar_.reset(); +} + void PrefsAsh::OnPrefChanged(mojom::PrefPath path) { auto state = GetState(path); const base::Value* value = @@ -166,8 +185,9 @@ void PrefsAsh::OnPrimaryProfileReady(Profile* profile) { profile_manager_->RemoveObserver(this); - profile_prefs_ = profile->GetPrefs(); - profile_prefs_registrar_.Init(profile_prefs_); + + profile_prefs_registrar_ = std::make_unique<PrefChangeRegistrar>(); + profile_prefs_registrar_->Init(profile->GetPrefs()); } } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/prefs_ash.h b/chrome/browser/ash/crosapi/prefs_ash.h index 2305256..82010e49 100644 --- a/chrome/browser/ash/crosapi/prefs_ash.h +++ b/chrome/browser/ash/crosapi/prefs_ash.h
@@ -10,9 +10,14 @@ #include <utility> #include "base/gtest_prod_util.h" +#include "base/scoped_observation.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager_observer.h" +#include "chrome/browser/profiles/profile_observer.h" #include "chromeos/crosapi/mojom/prefs.mojom.h" #include "components/prefs/pref_change_registrar.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote_set.h" @@ -26,7 +31,10 @@ // The ash-chrome implementation of the Prefs crosapi interface. // This class must only be used from the main thread. -class PrefsAsh : public mojom::Prefs, public ProfileManagerObserver { +class PrefsAsh : public mojom::Prefs, + public ProfileManagerObserver, + public ProfileObserver, + public content::NotificationObserver { public: PrefsAsh(ProfileManager* profile_manager, PrefService* local_state); PrefsAsh(const PrefsAsh&) = delete; @@ -47,6 +55,14 @@ void OnProfileAdded(Profile* profile) override; void OnProfileManagerDestroying() override; + // ProfileObserver: + void OnProfileWillBeDestroyed(Profile* profile) override; + + // content::NotificationObserver: + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override; + // Used to inject |profile| as a primary profile for testing. void OnPrimaryProfileReadyForTesting(Profile* profile) { OnPrimaryProfileReady(profile); @@ -73,18 +89,20 @@ ProfileManager* profile_manager_; // In production, owned by g_browser_process, which outlives this object. PrefService* const local_state_; - // Owned by the primary profile. This will be set after the profile is - // initialized. - PrefService* profile_prefs_ = nullptr; PrefChangeRegistrar local_state_registrar_; - PrefChangeRegistrar profile_prefs_registrar_; + std::unique_ptr<PrefChangeRegistrar> profile_prefs_registrar_; // This class supports any number of connections. mojo::ReceiverSet<mojom::Prefs> receivers_; // This class supports any number of observers. std::map<mojom::PrefPath, mojo::RemoteSet<mojom::PrefObserver>> observers_; + + // Observe profile destruction to reset prefs observation. + base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this}; + + content::NotificationRegistrar notification_registrar_; }; } // namespace crosapi
diff --git a/chrome/browser/ash/drive/drive_integration_service.cc b/chrome/browser/ash/drive/drive_integration_service.cc index 767f177..8468a60 100644 --- a/chrome/browser/ash/drive/drive_integration_service.cc +++ b/chrome/browser/ash/drive/drive_integration_service.cc
@@ -421,12 +421,20 @@ void ToggleLocalMirroring() { DCHECK(integration_service_); - if (chromeos::features::IsDriveFsMirroringEnabled() && - pref_service_->GetBoolean(prefs::kDriveFsEnableMirrorSync)) { - // TODO(b/216228528): Disable mirror sync when the API is available. - integration_service_->EnableMirroring(base::BindOnce( - &DriveIntegrationService::OnEnableMirroringStatusUpdate, - integration_service_->weak_ptr_factory_.GetWeakPtr())); + if (!chromeos::features::IsDriveFsMirroringEnabled()) { + return; + } + + if (pref_service_->GetBoolean(prefs::kDriveFsEnableMirrorSync)) { + integration_service_->ToggleMirroring( + true, base::BindOnce( + &DriveIntegrationService::OnEnableMirroringStatusUpdate, + integration_service_->weak_ptr_factory_.GetWeakPtr())); + } else { + integration_service_->ToggleMirroring( + false, base::BindOnce( + &DriveIntegrationService::OnDisableMirroringStatusUpdate, + integration_service_->weak_ptr_factory_.GetWeakPtr())); } } @@ -970,6 +978,15 @@ } else { UmaEmitMountOutcome(DriveMountStatus::kUnknownFailure, mount_start_); } + + // Enable MirrorSync if the feature is enabled. + if (chromeos::features::IsDriveFsMirroringEnabled() && + profile_->GetPrefs()->GetBoolean(prefs::kDriveFsEnableMirrorSync)) { + ToggleMirroring( + true, + base::BindOnce(&DriveIntegrationService::OnEnableMirroringStatusUpdate, + weak_ptr_factory_.GetWeakPtr())); + } } void DriveIntegrationService::OnUnmounted( @@ -1158,8 +1175,22 @@ void DriveIntegrationService::OnEnableMirroringStatusUpdate( drivefs::mojom::MirrorSyncStatus status) { - VLOG(1) << "OnEnableMirroringStatusUpdate: " << status; mirroring_enabled_ = (status == drivefs::mojom::MirrorSyncStatus::kSuccess); + if (mirroring_enabled_) { + for (auto& observer : observers_) { + observer.OnMirroringEnabled(); + } + } +} + +void DriveIntegrationService::OnDisableMirroringStatusUpdate( + drivefs::mojom::MirrorSyncStatus status) { + if (status == drivefs::mojom::MirrorSyncStatus::kSuccess) { + mirroring_enabled_ = false; + for (auto& observer : observers_) { + observer.OnMirroringDisabled(); + } + } } bool DriveIntegrationService::IsMirroringEnabled() { @@ -1270,11 +1301,12 @@ } } -void DriveIntegrationService::EnableMirroring( - drivefs::mojom::DriveFs::EnableMirroringCallback callback) { +void DriveIntegrationService::ToggleMirroring( + bool enabled, + drivefs::mojom::DriveFs::ToggleMirroringCallback callback) { if (chromeos::features::IsDriveFsMirroringEnabled() && GetDriveFsInterface()) { - GetDriveFsInterface()->EnableMirroring(std::move(callback)); + GetDriveFsInterface()->ToggleMirroring(enabled, std::move(callback)); } }
diff --git a/chrome/browser/ash/drive/drive_integration_service.h b/chrome/browser/ash/drive/drive_integration_service.h index 792327c8..2fc49b0 100644 --- a/chrome/browser/ash/drive/drive_integration_service.h +++ b/chrome/browser/ash/drive/drive_integration_service.h
@@ -81,6 +81,12 @@ // Triggered when the `DriveIntegrationService` is being destroyed. virtual void OnDriveIntegrationServiceDestroyed() {} + + // Triggered when the mirroring functionality is enabled. + virtual void OnMirroringEnabled() {} + + // Triggered when the mirroring functionality is disabled. + virtual void OnMirroringDisabled() {} }; // DriveIntegrationService is used to integrate Drive to Chrome. This class @@ -232,10 +238,12 @@ bool crop_to_square, GetThumbnailCallback callback); - // Enable Mirroring for the current device. - void EnableMirroring( - drivefs::mojom::DriveFs::EnableMirroringCallback callback); + // Toggle mirroring on or off defined by |enabled|. + void ToggleMirroring( + bool enabled, + drivefs::mojom::DriveFs::ToggleMirroringCallback callback); + // Returns whether mirroring is enabled. bool IsMirroringEnabled(); private: @@ -323,6 +331,8 @@ void OnEnableMirroringStatusUpdate(drivefs::mojom::MirrorSyncStatus status); + void OnDisableMirroringStatusUpdate(drivefs::mojom::MirrorSyncStatus status); + friend class DriveIntegrationServiceFactory; Profile* profile_;
diff --git a/chrome/browser/ash/drive/drive_integration_service_browsertest.cc b/chrome/browser/ash/drive/drive_integration_service_browsertest.cc index 378d26c..5997639 100644 --- a/chrome/browser/ash/drive/drive_integration_service_browsertest.cc +++ b/chrome/browser/ash/drive/drive_integration_service_browsertest.cc
@@ -298,6 +298,37 @@ EXPECT_FALSE(drive_service->is_enabled()); } +class DriveMirrorSyncStatusObserver : public DriveIntegrationServiceObserver { + public: + explicit DriveMirrorSyncStatusObserver(bool expected_status) + : expected_status_(expected_status) { + quit_closure_ = run_loop_.QuitClosure(); + } + + DriveMirrorSyncStatusObserver(const DriveMirrorSyncStatusObserver&) = delete; + DriveMirrorSyncStatusObserver& operator=( + const DriveMirrorSyncStatusObserver&) = delete; + + ~DriveMirrorSyncStatusObserver() override {} + + void WaitForStatusChange() { run_loop_.Run(); } + + void OnMirroringEnabled() override { + quit_closure_.Run(); + EXPECT_TRUE(expected_status_); + } + + void OnMirroringDisabled() override { + quit_closure_.Run(); + EXPECT_FALSE(expected_status_); + } + + private: + base::RunLoop run_loop_; + base::RepeatingClosure quit_closure_; + bool expected_status_ = false; +}; + class DriveIntegrationBrowserTestWithMirrorSyncEnabled : public DriveIntegrationServiceBrowserTest { public: @@ -313,6 +344,22 @@ ~DriveIntegrationBrowserTestWithMirrorSyncEnabled() override {} + void ToggleMirrorSync(bool status) { + auto observer = std::make_unique<DriveMirrorSyncStatusObserver>(status); + auto* drive_service = + DriveIntegrationServiceFactory::FindForProfile(browser()->profile()); + drive_service->AddObserver(observer.get()); + + browser()->profile()->GetPrefs()->SetBoolean( + prefs::kDriveFsEnableMirrorSync, status); + observer->WaitForStatusChange(); + EXPECT_EQ(browser()->profile()->GetPrefs()->GetBoolean( + prefs::kDriveFsEnableMirrorSync), + status); + + drive_service->RemoveObserver(observer.get()); + } + private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -328,10 +375,24 @@ EXPECT_FALSE(drive_service->IsMirroringEnabled()); // Enable mirroring and ensure the integration service has it enabled. - browser()->profile()->GetPrefs()->SetBoolean(prefs::kDriveFsEnableMirrorSync, - true); - base::RunLoop().RunUntilIdle(); + ToggleMirrorSync(true); EXPECT_TRUE(drive_service->IsMirroringEnabled()); } +IN_PROC_BROWSER_TEST_F(DriveIntegrationBrowserTestWithMirrorSyncEnabled, + DisableMirrorSync) { + auto* drive_service = + DriveIntegrationServiceFactory::FindForProfile(browser()->profile()); + + // Ensure the mirror syncing service is enabled. + EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( + prefs::kDriveFsEnableMirrorSync)); + EXPECT_FALSE(drive_service->IsMirroringEnabled()); + ToggleMirrorSync(true); + EXPECT_TRUE(drive_service->IsMirroringEnabled()); + // Disable mirroring and ensure the integration service has it disabled. + ToggleMirrorSync(false); + EXPECT_FALSE(drive_service->IsMirroringEnabled()); +} + } // namespace drive
diff --git a/chrome/browser/ash/eche_app/eche_app_manager_factory.cc b/chrome/browser/ash/eche_app/eche_app_manager_factory.cc index baf1171..54c064c 100644 --- a/chrome/browser/ash/eche_app/eche_app_manager_factory.cc +++ b/chrome/browser/ash/eche_app/eche_app_manager_factory.cc
@@ -20,6 +20,7 @@ #include "ash/webui/eche_app_ui/eche_uid_provider.h" #include "ash/webui/eche_app_ui/system_info.h" #include "base/bind.h" +#include "base/check.h" #include "base/metrics/histogram_functions.h" #include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" @@ -45,6 +46,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/l10n/l10n_util.h" #include "ui/chromeos/devicetype_utils.h" +#include "ui/gfx/image/image.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" #include "url/gurl.h" @@ -91,13 +93,16 @@ kMaxValue = kOpenAppStreaming, }; -void LaunchBubble(const GURL& url) { +void LaunchBubble(const GURL& url, const gfx::Image& icon) { auto* eche_tray = GetEcheTray(); - // TODO(nayebi): if it is null log an error? Dcheck? + DCHECK(eche_tray); if (eche_tray) { eche_tray->SetUrl(url); + eche_tray->SetIcon(icon); + eche_tray->SetVisiblePreferred(true); if (!features::IsEcheSWAInBackgroundEnabled()) { eche_tray->ShowBubble(); + } else { eche_tray->InitBubble(); @@ -111,12 +116,14 @@ const absl::optional<int64_t>& notification_id, const std::u16string& visible_name, const absl::optional<int64_t>& user_id, + const gfx::Image& icon, Profile* profile) { EcheAppManagerFactory::GetInstance()->SetLastLaunchedAppInfo( LaunchedAppInfo::Builder() .SetPackageName(package_name) .SetVisibleName(visible_name) .SetUserId(user_id) + .SetIcon(icon) .Build()); std::u16string url; // Use hash mark(#) to send params to webui so we don't need to reload the @@ -145,7 +152,7 @@ const auto gurl = GURL(url); if (features::IsEcheCustomWidgetEnabled()) { - return LaunchBubble(gurl); + return LaunchBubble(gurl, icon); } web_app::SystemAppLaunchParams params; params.url = gurl; @@ -157,8 +164,10 @@ const absl::optional<int64_t>& notification_id, const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) { - LaunchWebApp(package_name, notification_id, visible_name, user_id, profile); + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) { + LaunchWebApp(package_name, notification_id, visible_name, user_id, icon, + profile); base::UmaHistogramEnumeration("Eche.NotificationClicked", NotificationInteraction::kOpenAppStreaming); EcheAppManagerFactory::GetInstance() @@ -170,11 +179,27 @@ EcheAppManagerFactory::GetInstance()->GetLastLaunchedAppInfo(); LaunchEcheApp(profile, absl::nullopt, last_launched_app_info->package_name(), last_launched_app_info->visible_name(), - last_launched_app_info->user_id()); + last_launched_app_info->user_id(), + last_launched_app_info->icon()); } } // namespace +LaunchedAppInfo::LaunchedAppInfo() = default; +LaunchedAppInfo::~LaunchedAppInfo() = default; +LaunchedAppInfo::LaunchedAppInfo(const std::string& package_name, + const std::u16string& visible_name, + const absl::optional<int64_t>& user_id, + const gfx::Image& icon) { + package_name_ = package_name; + visible_name_ = visible_name; + user_id_ = user_id; + icon_ = icon; +} + +LaunchedAppInfo::Builder::Builder() = default; +LaunchedAppInfo::Builder::~Builder() = default; + // static EcheAppManager* EcheAppManagerFactory::GetForProfile(Profile* profile) { return static_cast<EcheAppManager*>(
diff --git a/chrome/browser/ash/eche_app/eche_app_manager_factory.h b/chrome/browser/ash/eche_app/eche_app_manager_factory.h index dddc269..f505952 100644 --- a/chrome/browser/ash/eche_app/eche_app_manager_factory.h +++ b/chrome/browser/ash/eche_app/eche_app_manager_factory.h
@@ -10,6 +10,7 @@ #include "base/memory/weak_ptr.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/gfx/image/image.h" class Profile; @@ -24,12 +25,12 @@ public: class Builder { public: - Builder() = default; - ~Builder() = default; + Builder(); + ~Builder(); std::unique_ptr<LaunchedAppInfo> Build() { return base::WrapUnique( - new LaunchedAppInfo(package_name_, visible_name_, user_id_)); + new LaunchedAppInfo(package_name_, visible_name_, user_id_, icon_)); } Builder& SetPackageName(const std::string& package_name) { package_name_ = package_name; @@ -46,34 +47,39 @@ return *this; } + Builder& SetIcon(const gfx::Image& icon) { + icon_ = icon; + return *this; + } + private: std::string package_name_; std::u16string visible_name_; absl::optional<int64_t> user_id_; + gfx::Image icon_; }; - LaunchedAppInfo() = default; + LaunchedAppInfo(); LaunchedAppInfo(const LaunchedAppInfo&) = delete; LaunchedAppInfo& operator=(const LaunchedAppInfo&) = delete; - ~LaunchedAppInfo() = default; + ~LaunchedAppInfo(); std::string package_name() const { return package_name_; } std::u16string visible_name() const { return visible_name_; } absl::optional<int64_t> user_id() const { return user_id_; } + gfx::Image icon() const { return icon_; } protected: LaunchedAppInfo(const std::string& package_name, const std::u16string& visible_name, - const absl::optional<int64_t>& user_id) { - package_name_ = package_name; - visible_name_ = visible_name; - user_id_ = user_id; - } + const absl::optional<int64_t>& user_id, + const gfx::Image& icon); private: std::string package_name_; std::u16string visible_name_; absl::optional<int64_t> user_id_; + gfx::Image icon_; }; // Factory to create a single EcheAppManager.
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter.cc b/chrome/browser/ash/login/reporting/login_logout_reporter.cc index 072a019..849de275 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter.cc
@@ -80,6 +80,12 @@ } } // namespace +// static +const base::Feature + LoginLogoutReporter::kEnableKioskAndGuestLoginLogoutReporting{ + "EnableKioskAndGuestLoginLogoutReporting", + base::FEATURE_ENABLED_BY_DEFAULT}; + AccountId LoginLogoutReporter::Delegate::GetLastLoginAttemptAccountId() const { if (!ash::ExistingUserController::current_controller()) { return EmptyAccountId(); @@ -115,10 +121,11 @@ // static std::unique_ptr<LoginLogoutReporter> LoginLogoutReporter::CreateForTest( std::unique_ptr<::reporting::UserEventReporterHelper> reporter_helper, - std::unique_ptr<LoginLogoutReporter::Delegate> delegate) { - return base::WrapUnique( - new LoginLogoutReporter(std::move(reporter_helper), std::move(delegate), - /*managed_session_service=*/nullptr)); + std::unique_ptr<LoginLogoutReporter::Delegate> delegate, + policy::ManagedSessionService* managed_session_service) { + return base::WrapUnique(new LoginLogoutReporter(std::move(reporter_helper), + std::move(delegate), + managed_session_service)); } void LoginLogoutReporter::MaybeReportEvent(LoginLogoutRecord record, @@ -127,26 +134,27 @@ return; } - record.set_event_timestamp_sec(base::Time::Now().ToTimeT()); const LoginLogoutSessionType session_type = GetSessionType(account_id); + if (!base::FeatureList::IsEnabled(kEnableKioskAndGuestLoginLogoutReporting) && + (session_type == LoginLogoutSessionType::GUEST_SESSION || + session_type == LoginLogoutSessionType::KIOSK_SESSION)) { + return; + } + record.set_event_timestamp_sec(base::Time::Now().ToTimeT()); record.set_session_type(session_type); const std::string& user_email = account_id.GetUserEmail(); - if (session_type == LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION) { + if (session_type == LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION || + session_type == LoginLogoutSessionType::GUEST_SESSION) { record.set_is_guest_session(true); } else if (session_type == LoginLogoutSessionType::REGULAR_USER_SESSION && reporter_helper_->ShouldReportUser(user_email)) { record.mutable_affiliated_user()->set_user_email(user_email); } - reporter_helper_->ReportEvent(&record, ::reporting::Priority::SECURITY); } void LoginLogoutReporter::OnLogin(Profile* profile) { user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(profile); - if (user->IsKioskType()) { - return; - } - LoginLogoutRecord record; record.mutable_login_event(); MaybeReportEvent(std::move(record), user->GetAccountId()); @@ -154,10 +162,6 @@ void LoginLogoutReporter::OnSessionTerminationStarted( const user_manager::User* user) { - if (user->IsKioskType()) { - return; - } - LoginLogoutRecord record; record.mutable_logout_event(); MaybeReportEvent(std::move(record), user->GetAccountId());
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter.h b/chrome/browser/ash/login/reporting/login_logout_reporter.h index fc18b14..2e81f96 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter.h +++ b/chrome/browser/ash/login/reporting/login_logout_reporter.h
@@ -7,6 +7,7 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "base/containers/queue.h" +#include "base/feature_list.h" #include "base/scoped_observation.h" #include "chrome/browser/ash/policy/status_collector/managed_session_service.h" #include "chrome/browser/policy/messaging_layer/proto/synced/login_logout_event.pb.h" @@ -31,8 +32,6 @@ Delegate(const Delegate& other) = delete; Delegate& operator=(const Delegate& other) = delete; - Delegate(const Delegate&& other) = delete; - Delegate& operator=(const Delegate&& other) = delete; virtual ~Delegate() = default; @@ -43,8 +42,6 @@ LoginLogoutReporter(const LoginLogoutReporter& other) = delete; LoginLogoutReporter& operator=(const LoginLogoutReporter& other) = delete; - LoginLogoutReporter(const LoginLogoutReporter&& other) = delete; - LoginLogoutReporter& operator=(const LoginLogoutReporter&& other) = delete; ~LoginLogoutReporter() override; @@ -53,7 +50,8 @@ static std::unique_ptr<LoginLogoutReporter> CreateForTest( std::unique_ptr<::reporting::UserEventReporterHelper> reporter_helper, - std::unique_ptr<Delegate> delegate); + std::unique_ptr<Delegate> delegate, + policy::ManagedSessionService* managed_session_service = nullptr); // Report user device failed login attempt. void OnLoginFailure(const AuthFailure& error) override; @@ -65,6 +63,8 @@ void OnSessionTerminationStarted(const user_manager::User* user) override; private: + static const base::Feature kEnableKioskAndGuestLoginLogoutReporting; + LoginLogoutReporter( std::unique_ptr<::reporting::UserEventReporterHelper> reporter_helper, std::unique_ptr<Delegate> delegate, @@ -79,6 +79,9 @@ base::ScopedObservation<policy::ManagedSessionService, policy::ManagedSessionService::Observer> managed_session_observation_{this}; + + // To be able to access |kEnableKioskAndGuestLoginLogoutReporting| in tests. + friend class LoginLogoutTestHelper; }; } // namespace reporting
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc b/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc index deeddf40..b2c1d6ad 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ash/login/reporting/login_logout_reporter_test_delegate.h" +#include "ash/components/login/session/session_termination_manager.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/policy/core/device_local_account.h" @@ -17,483 +19,445 @@ #include "components/user_manager/user_names.h" #include "content/public/test/browser_task_environment.h" +using testing::_; +using testing::Eq; +using testing::StrEq; + namespace ash { namespace reporting { -using ::testing::_; +constexpr char user_email[] = "user@managed.com"; -class LoginLogoutReporterTest : public ::testing::Test { - protected: - void SetUp() override { - chromeos::PowerManagerClient::InitializeFake(); +class LoginLogoutTestHelper { + public: + LoginLogoutTestHelper() = default; + + LoginLogoutTestHelper(const LoginLogoutTestHelper&) = delete; + LoginLogoutTestHelper& operator=(const LoginLogoutTestHelper&) = delete; + + ~LoginLogoutTestHelper() = default; + + void Init() { + PowerManagerClient::InitializeFake(); + session_termination_manager_ = + std::make_unique<SessionTerminationManager>(); auto user_manager = std::make_unique<FakeChromeUserManager>(); user_manager_ = user_manager.get(); user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( std::move(user_manager)); + scoped_feature_list_.InitAndEnableFeature( + LoginLogoutReporter::kEnableKioskAndGuestLoginLogoutReporting); } - void TearDown() override { chromeos::PowerManagerClient::Shutdown(); } + void Shutdown() { PowerManagerClient::Shutdown(); } - std::unique_ptr<TestingProfile> CreateRegularProfile( - base::StringPiece user_email) { - AccountId account_id = AccountId::FromUserEmail(std::string(user_email)); + void DisableKioskAndGuestLoginLogoutReporting() { + scoped_feature_list_.Reset(); + scoped_feature_list_.InitAndDisableFeature( + LoginLogoutReporter::kEnableKioskAndGuestLoginLogoutReporting); + } + + std::unique_ptr<TestingProfile> CreateProfile(user_manager::User* user) { TestingProfile::Builder profile_builder; - profile_builder.SetProfileName(account_id.GetUserEmail()); + profile_builder.SetProfileName(user->GetAccountId().GetUserEmail()); auto profile = profile_builder.Build(); - user_manager_->AddUser(account_id); - user_manager_->LoginUser(account_id, true); + ProfileHelper::Get()->SetProfileToUserMappingForTesting(user); + ProfileHelper::Get()->SetUserToProfileMappingForTesting(user, + profile.get()); + user_manager_->LoginUser(user->GetAccountId(), true); return profile; } + std::unique_ptr<TestingProfile> CreateRegularUserProfile() { + AccountId account_id = AccountId::FromUserEmail(user_email); + auto* const user = user_manager_->AddUser(account_id); + return CreateProfile(user); + } + std::unique_ptr<TestingProfile> CreatePublicAccountProfile() { AccountId account_id = AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( - "guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)); - TestingProfile::Builder profile_builder; - profile_builder.SetProfileName(account_id.GetUserEmail()); - auto profile = profile_builder.Build(); - user_manager_->AddPublicAccountUser(account_id); - user_manager_->LoginUser(account_id, true); - return profile; + "managed_guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)); + auto* const user = user_manager_->AddPublicAccountUser(account_id); + return CreateProfile(user); + } + + std::unique_ptr<TestingProfile> CreateGuestProfile() { + auto* const user = user_manager_->AddGuestUser(); + return CreateProfile(user); } std::unique_ptr<TestingProfile> CreateKioskAppProfile() { AccountId account_id = AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( "kiosk", policy::DeviceLocalAccount::TYPE_KIOSK_APP)); - TestingProfile::Builder profile_builder; - profile_builder.SetProfileName(account_id.GetUserEmail()); - auto profile = profile_builder.Build(); - user_manager_->AddKioskAppUser(account_id); - user_manager_->LoginUser(account_id, true); - return profile; + auto* const user = user_manager_->AddKioskAppUser(account_id); + return CreateProfile(user); } + std::unique_ptr<TestingProfile> CreateArcKioskAppProfile() { + AccountId account_id = + AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( + "arc_kiosk", policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP)); + auto* const user = user_manager_->AddArcKioskAppUser(account_id); + return CreateProfile(user); + } + + std::unique_ptr<TestingProfile> CreateWebKioskAppProfile() { + AccountId account_id = + AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( + "webkiosk", policy::DeviceLocalAccount::TYPE_WEB_KIOSK_APP)); + auto* const user = user_manager_->AddWebKioskAppUser(account_id); + return CreateProfile(user); + } + + std::unique_ptr<TestingProfile> CreateProfileByType( + user_manager::UserType user_type) { + switch (user_type) { + case user_manager::USER_TYPE_REGULAR: + return CreateRegularUserProfile(); + case user_manager::USER_TYPE_GUEST: + return CreateGuestProfile(); + case user_manager::USER_TYPE_PUBLIC_ACCOUNT: + return CreatePublicAccountProfile(); + case user_manager::USER_TYPE_KIOSK_APP: + return CreateKioskAppProfile(); + case user_manager::USER_TYPE_ARC_KIOSK_APP: + return CreateArcKioskAppProfile(); + case user_manager::USER_TYPE_WEB_KIOSK_APP: + return CreateWebKioskAppProfile(); + default: + NOTREACHED(); + return nullptr; + } + } + + std::unique_ptr<::reporting::UserEventReporterHelperTesting> + GetReporterHelper(bool reporting_enabled, bool should_report_user) { + auto mock_queue = std::unique_ptr<::reporting::MockReportQueue, + base::OnTaskRunnerDeleter>( + new testing::NiceMock<::reporting::MockReportQueue>(), + base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); + + ON_CALL(*mock_queue, AddRecord(_, ::reporting::Priority::SECURITY, _)) + .WillByDefault([&](base::StringPiece record_string, + ::reporting::Priority event_priority, + ::reporting::ReportQueue::EnqueueCallback) { + ++report_count_; + EXPECT_TRUE(record_.ParseFromArray(record_string.data(), + record_string.size())); + }); + + auto reporter_helper = + std::make_unique<::reporting::UserEventReporterHelperTesting>( + reporting_enabled, should_report_user, std::move(mock_queue)); + return reporter_helper; + } + + LoginLogoutRecord GetRecord() { return record_; } + + int GetReportCount() { return report_count_; } + private: FakeChromeUserManager* user_manager_; std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; content::BrowserTaskEnvironment task_environment_; + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<SessionTerminationManager> session_termination_manager_; + + LoginLogoutRecord record_; + int report_count_ = 0; +}; + +struct LoginLogoutReporterTestCase { + user_manager::UserType user_type; + LoginLogoutSessionType expected_session_type; +}; + +class LoginLogoutReporterTest + : public ::testing::TestWithParam<LoginLogoutReporterTestCase> { + protected: + void SetUp() override { test_helper_.Init(); } + + void TearDown() override { test_helper_.Shutdown(); } + + LoginLogoutTestHelper test_helper_; }; TEST_F(LoginLogoutReporterTest, ReportAffiliatedLogin) { - static constexpr char user_email[] = "affiliated@managed.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); - - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/true, std::move(mock_queue)); + policy::ManagedSessionService managed_session_service; + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/true); auto reporter = LoginLogoutReporter::CreateForTest( std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateRegularProfile(user_email); - reporter->OnLogin(profile.get()); + std::make_unique<LoginLogoutReporterTestDelegate>(), + &managed_session_service); - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + auto profile = test_helper_.CreateRegularUserProfile(); + auto* const user = ProfileHelper::Get()->GetUserByProfile(profile.get()); + managed_session_service.OnUserProfileLoaded(user->GetAccountId()); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); EXPECT_FALSE(record.is_guest_session()); EXPECT_FALSE(record.has_logout_event()); ASSERT_TRUE(record.has_affiliated_user()); ASSERT_TRUE(record.affiliated_user().has_user_email()); - EXPECT_THAT(record.affiliated_user().user_email(), testing::Eq(user_email)); + EXPECT_THAT(record.affiliated_user().user_email(), StrEq(user_email)); ASSERT_TRUE(record.has_session_type()); EXPECT_THAT(record.session_type(), - testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); + Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); ASSERT_TRUE(record.has_login_event()); EXPECT_FALSE(record.login_event().has_failure()); } -TEST_F(LoginLogoutReporterTest, ReportUnaffiliatedLogin) { - static constexpr char user_email[] = "unaffiliated@unmanaged.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +TEST_P(LoginLogoutReporterTest, ReportUnaffiliatedLogin) { + const auto test_case = GetParam(); + const bool is_guest_session = + test_case.user_type == user_manager::USER_TYPE_PUBLIC_ACCOUNT || + test_case.user_type == user_manager::USER_TYPE_GUEST; - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); + policy::ManagedSessionService managed_session_service; + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); auto reporter = LoginLogoutReporter::CreateForTest( std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateRegularProfile(user_email); - reporter->OnLogin(profile.get()); + std::make_unique<LoginLogoutReporterTestDelegate>(), + &managed_session_service); - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + auto profile = test_helper_.CreateProfileByType(test_case.user_type); + auto* const user = ProfileHelper::Get()->GetUserByProfile(profile.get()); + managed_session_service.OnUserProfileLoaded(user->GetAccountId()); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); - EXPECT_FALSE(record.is_guest_session()); + EXPECT_THAT(record.is_guest_session(), Eq(is_guest_session)); EXPECT_FALSE(record.has_logout_event()); EXPECT_FALSE(record.has_affiliated_user()); - ASSERT_TRUE(record.has_login_event()); ASSERT_TRUE(record.has_session_type()); - EXPECT_THAT(record.session_type(), - testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); - EXPECT_FALSE(record.login_event().has_failure()); -} - -TEST_F(LoginLogoutReporterTest, ReportManagedGuestLogin) { - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); - - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); - - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreatePublicAccountProfile(); - reporter->OnLogin(profile.get()); - - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); - EXPECT_TRUE(record.has_event_timestamp_sec()); - EXPECT_TRUE(record.is_guest_session()); - EXPECT_FALSE(record.has_logout_event()); - EXPECT_FALSE(record.has_affiliated_user()); + EXPECT_THAT(record.session_type(), Eq(test_case.expected_session_type)); ASSERT_TRUE(record.has_login_event()); - ASSERT_TRUE(record.has_session_type()); - EXPECT_THAT(record.session_type(), - testing::Eq(LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION)); EXPECT_FALSE(record.login_event().has_failure()); } -TEST_F(LoginLogoutReporterTest, KioskLogin) { - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); - - EXPECT_CALL(*mock_queue, AddRecord).Times(0); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); - - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateKioskAppProfile(); - reporter->OnLogin(profile.get()); -} - TEST_F(LoginLogoutReporterTest, ReportAffiliatedLogout) { - static constexpr char user_email[] = "affiliated@managed.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); - - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/true, std::move(mock_queue)); + policy::ManagedSessionService managed_session_service; + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/true); auto reporter = LoginLogoutReporter::CreateForTest( std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateRegularProfile(user_email); - reporter->OnSessionTerminationStarted( - ProfileHelper::Get()->GetUserByProfile(profile.get())); + std::make_unique<LoginLogoutReporterTestDelegate>(), + &managed_session_service); - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + auto profile = test_helper_.CreateRegularUserProfile(); + managed_session_service.OnSessionWillBeTerminated(); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); EXPECT_FALSE(record.is_guest_session()); EXPECT_FALSE(record.has_login_event()); EXPECT_TRUE(record.has_logout_event()); ASSERT_TRUE(record.has_affiliated_user()); ASSERT_TRUE(record.affiliated_user().has_user_email()); - EXPECT_THAT(record.affiliated_user().user_email(), testing::Eq(user_email)); + EXPECT_THAT(record.affiliated_user().user_email(), StrEq(user_email)); ASSERT_TRUE(record.has_session_type()); EXPECT_THAT(record.session_type(), - testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); + Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); } -TEST_F(LoginLogoutReporterTest, ReportUnaffiliatedLogout) { - static constexpr char user_email[] = "unaffiliated@unmanaged.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +TEST_P(LoginLogoutReporterTest, ReportUnaffiliatedLogout) { + const auto test_case = GetParam(); + const bool is_guest_session = + test_case.user_type == user_manager::USER_TYPE_PUBLIC_ACCOUNT || + test_case.user_type == user_manager::USER_TYPE_GUEST; - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); + policy::ManagedSessionService managed_session_service; + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); auto reporter = LoginLogoutReporter::CreateForTest( std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateRegularProfile(user_email); - reporter->OnSessionTerminationStarted( - ProfileHelper::Get()->GetUserByProfile(profile.get())); + std::make_unique<LoginLogoutReporterTestDelegate>(), + &managed_session_service); - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + auto profile = test_helper_.CreateProfileByType(test_case.user_type); + managed_session_service.OnSessionWillBeTerminated(); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); - EXPECT_FALSE(record.is_guest_session()); + EXPECT_THAT(record.is_guest_session(), Eq(is_guest_session)); EXPECT_FALSE(record.has_login_event()); EXPECT_TRUE(record.has_logout_event()); EXPECT_FALSE(record.has_affiliated_user()); ASSERT_TRUE(record.has_session_type()); - EXPECT_THAT(record.session_type(), - testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); + EXPECT_THAT(record.session_type(), Eq(test_case.expected_session_type)); } -TEST_F(LoginLogoutReporterTest, ReportManagedGuestLogout) { - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); - - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/true, std::move(mock_queue)); +TEST_P(LoginLogoutReporterTest, KioskAndGuestLoginLogoutReportingDisabled) { + test_helper_.DisableKioskAndGuestLoginLogoutReporting(); + const auto test_case = GetParam(); + policy::ManagedSessionService managed_session_service; + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); auto reporter = LoginLogoutReporter::CreateForTest( std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreatePublicAccountProfile(); - reporter->OnSessionTerminationStarted( - ProfileHelper::Get()->GetUserByProfile(profile.get())); + std::make_unique<LoginLogoutReporterTestDelegate>(), + &managed_session_service); - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); - EXPECT_TRUE(record.has_event_timestamp_sec()); - EXPECT_TRUE(record.is_guest_session()); - EXPECT_FALSE(record.has_login_event()); - EXPECT_TRUE(record.has_logout_event()); - EXPECT_FALSE(record.has_affiliated_user()); - ASSERT_TRUE(record.has_session_type()); - EXPECT_THAT(record.session_type(), - testing::Eq(LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION)); + auto profile = test_helper_.CreateProfileByType(test_case.user_type); + auto* const user = ProfileHelper::Get()->GetUserByProfile(profile.get()); + managed_session_service.OnUserProfileLoaded(user->GetAccountId()); + managed_session_service.OnSessionWillBeTerminated(); + + int expected_report_count = + test_case.user_type == user_manager::USER_TYPE_GUEST || + test_case.user_type == user_manager::USER_TYPE_KIOSK_APP || + test_case.user_type == user_manager::USER_TYPE_ARC_KIOSK_APP || + test_case.user_type == user_manager::USER_TYPE_WEB_KIOSK_APP + ? 0 + : 2; + ASSERT_THAT(test_helper_.GetReportCount(), Eq(expected_report_count)); } -TEST_F(LoginLogoutReporterTest, KioskLogout) { - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); - - EXPECT_CALL(*mock_queue, AddRecord).Times(0); - - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); +TEST_P(LoginLogoutReporterTest, ReportLoginLogoutDisabled) { + const auto test_case = GetParam(); + policy::ManagedSessionService managed_session_service; + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/false, + /*should_report_user=*/false); auto reporter = LoginLogoutReporter::CreateForTest( std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateKioskAppProfile(); - reporter->OnSessionTerminationStarted( - ProfileHelper::Get()->GetUserByProfile(profile.get())); + std::make_unique<LoginLogoutReporterTestDelegate>(), + &managed_session_service); + + auto profile = test_helper_.CreateProfileByType(test_case.user_type); + auto* const user = ProfileHelper::Get()->GetUserByProfile(profile.get()); + managed_session_service.OnUserProfileLoaded(user->GetAccountId()); + managed_session_service.OnSessionWillBeTerminated(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(0)); } -TEST_F(LoginLogoutReporterTest, ReportAffiliatedLoginFailure) { - static constexpr char user_email[] = "affiliated@managed.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +INSTANTIATE_TEST_SUITE_P(All, + LoginLogoutReporterTest, + ::testing::ValuesIn<LoginLogoutReporterTestCase>( + {{user_manager::USER_TYPE_REGULAR, + LoginLogoutSessionType::REGULAR_USER_SESSION}, + {user_manager::USER_TYPE_GUEST, + LoginLogoutSessionType::GUEST_SESSION}, + {user_manager::USER_TYPE_PUBLIC_ACCOUNT, + LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION}, + {user_manager::USER_TYPE_KIOSK_APP, + LoginLogoutSessionType::KIOSK_SESSION}, + {user_manager::USER_TYPE_ARC_KIOSK_APP, + LoginLogoutSessionType::KIOSK_SESSION}, + {user_manager::USER_TYPE_WEB_KIOSK_APP, + LoginLogoutSessionType::KIOSK_SESSION}})); - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); +class LoginFailureReporterTest : public ::testing::TestWithParam<AuthFailure> { + protected: + void SetUp() override { test_helper_.Init(); } - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/true, std::move(mock_queue)); + void TearDown() override { test_helper_.Shutdown(); } - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>( - AccountId::FromUserEmail(std::string(user_email)))); - reporter->OnLoginFailure(AuthFailure(AuthFailure::OWNER_REQUIRED)); + LoginLogoutTestHelper test_helper_; +}; - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); +TEST_F(LoginFailureReporterTest, ReportAffiliatedLoginFailure_OwnerRequired) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + AccountId::FromUserEmail(user_email)); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/true); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::OWNER_REQUIRED)); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); EXPECT_FALSE(record.is_guest_session()); EXPECT_FALSE(record.has_logout_event()); ASSERT_TRUE(record.has_affiliated_user()); ASSERT_TRUE(record.affiliated_user().has_user_email()); - EXPECT_THAT(record.affiliated_user().user_email(), testing::Eq(user_email)); + EXPECT_THAT(record.affiliated_user().user_email(), StrEq(user_email)); ASSERT_TRUE(record.has_session_type()); EXPECT_THAT(record.session_type(), testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); ASSERT_TRUE(record.has_login_event()); ASSERT_TRUE(record.login_event().has_failure()); ASSERT_THAT(record.login_event().failure().reason(), - testing::Eq(LoginFailureReason::OWNER_REQUIRED)); + Eq(LoginFailureReason::OWNER_REQUIRED)); } -TEST_F(LoginLogoutReporterTest, ReportAffiliatedLoginAuthenticationFailure) { - static constexpr char user_email[] = "affiliated@managed.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +TEST_F(LoginFailureReporterTest, + ReportAffiliatedLoginFailure_UnrecoverableCryptohome) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + AccountId::FromUserEmail(user_email)); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/true); - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/true, std::move(mock_queue)); + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::UNRECOVERABLE_CRYPTOHOME)); + const LoginLogoutRecord& record = test_helper_.GetRecord(); - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>( - AccountId::FromUserEmail(std::string(user_email)))); - reporter->OnLoginFailure( - AuthFailure(AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME)); - - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); EXPECT_FALSE(record.is_guest_session()); EXPECT_FALSE(record.has_logout_event()); ASSERT_TRUE(record.has_affiliated_user()); ASSERT_TRUE(record.affiliated_user().has_user_email()); - EXPECT_THAT(record.affiliated_user().user_email(), testing::Eq(user_email)); - ASSERT_TRUE(record.has_login_event()); + EXPECT_THAT(record.affiliated_user().user_email(), StrEq(user_email)); ASSERT_TRUE(record.has_session_type()); EXPECT_THAT(record.session_type(), testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); + ASSERT_TRUE(record.has_login_event()); ASSERT_TRUE(record.login_event().has_failure()); ASSERT_THAT(record.login_event().failure().reason(), - testing::Eq(LoginFailureReason::AUTHENTICATION_ERROR)); + Eq(LoginFailureReason::UNRECOVERABLE_CRYPTOHOME)); } -TEST_F(LoginLogoutReporterTest, ReportUnaffiliatedLoginFailure) { - static constexpr char user_email[] = "unaffiliated@unmanaged.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +TEST_F(LoginFailureReporterTest, ReportUnaffiliatedLoginFailure_TpmError) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + AccountId::FromUserEmail(user_email)); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); + managed_session_service.OnAuthFailure(AuthFailure(AuthFailure::TPM_ERROR)); + const LoginLogoutRecord& record = test_helper_.GetRecord(); - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>( - AccountId::FromUserEmail(std::string(user_email)))); - reporter->OnLoginFailure(AuthFailure(AuthFailure::TPM_ERROR)); - - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); EXPECT_FALSE(record.is_guest_session()); EXPECT_FALSE(record.has_logout_event()); @@ -504,41 +468,29 @@ ASSERT_TRUE(record.has_login_event()); ASSERT_TRUE(record.login_event().has_failure()); ASSERT_THAT(record.login_event().failure().reason(), - testing::Eq(LoginFailureReason::TPM_ERROR)); + Eq(LoginFailureReason::TPM_ERROR)); } -TEST_F(LoginLogoutReporterTest, ReportManagedGuestLoginFailure) { - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +TEST_F(LoginFailureReporterTest, + ReportPublicAccountLoginFailure_TpmUpdateRequired) { + policy::ManagedSessionService managed_session_service; + AccountId account_id = + AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( + "managed_guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)); + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>(account_id); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); - LoginLogoutRecord record; - ::reporting::Priority priority; - EXPECT_CALL(*mock_queue, AddRecord(_, _, _)) - .WillOnce( - [&record, &priority](base::StringPiece record_string, - ::reporting::Priority event_priority, - ::reporting::ReportQueue::EnqueueCallback) { - EXPECT_TRUE(record.ParseFromArray(record_string.data(), - record_string.size())); - priority = event_priority; - }); + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/true, - /*should_report_user=*/false, std::move(mock_queue)); + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::TPM_UPDATE_REQUIRED)); + const LoginLogoutRecord& record = test_helper_.GetRecord(); - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>( - AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( - "guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)))); - reporter->OnLoginFailure( - AuthFailure(AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME)); - - EXPECT_THAT(priority, testing::Eq(::reporting::Priority::SECURITY)); + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); EXPECT_TRUE(record.has_event_timestamp_sec()); EXPECT_TRUE(record.is_guest_session()); EXPECT_FALSE(record.has_logout_event()); @@ -549,29 +501,209 @@ ASSERT_TRUE(record.has_login_event()); ASSERT_TRUE(record.login_event().has_failure()); ASSERT_THAT(record.login_event().failure().reason(), - testing::Eq(LoginFailureReason::INTERNAL_LOGIN_FAILURE_REASON)); + Eq(LoginFailureReason::TPM_UPDATE_REQUIRED)); } -TEST_F(LoginLogoutReporterTest, ShouldNotReportEvent) { - static constexpr char user_email[] = "affiliated@managed.org"; - auto mock_queue = - std::unique_ptr<::reporting::MockReportQueue, base::OnTaskRunnerDeleter>( - new testing::StrictMock<::reporting::MockReportQueue>(), - base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get())); +TEST_F(LoginFailureReporterTest, + ReportPublicAccountLoginFailure_CouldNotMountTmpfs) { + policy::ManagedSessionService managed_session_service; + AccountId account_id = + AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( + "managed_guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)); + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>(account_id); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); - EXPECT_CALL(*mock_queue, AddRecord).Times(0); + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); - auto reporter_helper = - std::make_unique<::reporting::UserEventReporterHelperTesting>( - /*reporting_enabled=*/false, - /*should_report_user=*/true, std::move(mock_queue)); + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::COULD_NOT_MOUNT_TMPFS)); + const LoginLogoutRecord& record = test_helper_.GetRecord(); - auto reporter = LoginLogoutReporter::CreateForTest( - std::move(reporter_helper), - std::make_unique<LoginLogoutReporterTestDelegate>()); - auto profile = CreateRegularProfile(user_email); - reporter->OnLogin(profile.get()); + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); + EXPECT_TRUE(record.has_event_timestamp_sec()); + EXPECT_TRUE(record.is_guest_session()); + EXPECT_FALSE(record.has_logout_event()); + EXPECT_FALSE(record.has_affiliated_user()); + ASSERT_TRUE(record.has_session_type()); + EXPECT_THAT(record.session_type(), + testing::Eq(LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION)); + ASSERT_TRUE(record.has_login_event()); + ASSERT_TRUE(record.login_event().has_failure()); + ASSERT_THAT(record.login_event().failure().reason(), + Eq(LoginFailureReason::COULD_NOT_MOUNT_TMPFS)); } +TEST_F(LoginFailureReporterTest, ReportGuestLoginFailure_MissingCryptohome) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + user_manager::GuestAccountId()); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::MISSING_CRYPTOHOME)); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); + EXPECT_TRUE(record.has_event_timestamp_sec()); + EXPECT_TRUE(record.is_guest_session()); + EXPECT_FALSE(record.has_logout_event()); + EXPECT_FALSE(record.has_affiliated_user()); + ASSERT_TRUE(record.has_session_type()); + EXPECT_THAT(record.session_type(), + testing::Eq(LoginLogoutSessionType::GUEST_SESSION)); + ASSERT_TRUE(record.has_login_event()); + ASSERT_TRUE(record.login_event().has_failure()); + ASSERT_THAT(record.login_event().failure().reason(), + Eq(LoginFailureReason::MISSING_CRYPTOHOME)); +} + +TEST_F(LoginFailureReporterTest, GuestLoginLogoutReportingDisabled) { + test_helper_.DisableKioskAndGuestLoginLogoutReporting(); + + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + user_manager::GuestAccountId()); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::MISSING_CRYPTOHOME)); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(0)); +} + +TEST_F(LoginFailureReporterTest, ReportLoginLogoutDisabled) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + AccountId::FromUserEmail(user_email)); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/false, + /*should_report_user=*/true); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure( + AuthFailure(AuthFailure::MISSING_CRYPTOHOME)); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(0)); +} + +TEST_P(LoginFailureReporterTest, + ReportUnaffiliatedLoginFailure_AuthenticationError) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + AccountId::FromUserEmail(user_email)); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure(GetParam()); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); + EXPECT_TRUE(record.has_event_timestamp_sec()); + EXPECT_FALSE(record.is_guest_session()); + EXPECT_FALSE(record.has_logout_event()); + EXPECT_FALSE(record.has_affiliated_user()); + ASSERT_TRUE(record.has_session_type()); + EXPECT_THAT(record.session_type(), + testing::Eq(LoginLogoutSessionType::REGULAR_USER_SESSION)); + ASSERT_TRUE(record.has_login_event()); + ASSERT_TRUE(record.login_event().has_failure()); + ASSERT_THAT(record.login_event().failure().reason(), + Eq(LoginFailureReason::AUTHENTICATION_ERROR)); +} + +TEST_P(LoginFailureReporterTest, + ReportPublicAccountLoginFailure_InternalLoginFailure) { + policy::ManagedSessionService managed_session_service; + AccountId account_id = + AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( + "managed_guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)); + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>(account_id); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure(GetParam()); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); + EXPECT_TRUE(record.has_event_timestamp_sec()); + EXPECT_TRUE(record.is_guest_session()); + EXPECT_FALSE(record.has_logout_event()); + EXPECT_FALSE(record.has_affiliated_user()); + ASSERT_TRUE(record.has_session_type()); + EXPECT_THAT(record.session_type(), + testing::Eq(LoginLogoutSessionType::PUBLIC_ACCOUNT_SESSION)); + ASSERT_TRUE(record.has_login_event()); + ASSERT_TRUE(record.login_event().has_failure()); + ASSERT_THAT(record.login_event().failure().reason(), + Eq(LoginFailureReason::INTERNAL_LOGIN_FAILURE_REASON)); +} + +TEST_P(LoginFailureReporterTest, ReportGuestLoginFailure_InternalLoginFailure) { + policy::ManagedSessionService managed_session_service; + auto delegate = std::make_unique<LoginLogoutReporterTestDelegate>( + user_manager::GuestAccountId()); + auto reporter_helper = test_helper_.GetReporterHelper( + /*reporting_enabled=*/true, + /*should_report_user=*/false); + + auto reporter = LoginLogoutReporter::CreateForTest(std::move(reporter_helper), + std::move(delegate), + &managed_session_service); + + managed_session_service.OnAuthFailure(GetParam()); + const LoginLogoutRecord& record = test_helper_.GetRecord(); + + ASSERT_THAT(test_helper_.GetReportCount(), Eq(1)); + EXPECT_TRUE(record.has_event_timestamp_sec()); + EXPECT_TRUE(record.is_guest_session()); + EXPECT_FALSE(record.has_logout_event()); + EXPECT_FALSE(record.has_affiliated_user()); + ASSERT_TRUE(record.has_session_type()); + EXPECT_THAT(record.session_type(), + testing::Eq(LoginLogoutSessionType::GUEST_SESSION)); + ASSERT_TRUE(record.has_login_event()); + ASSERT_TRUE(record.login_event().has_failure()); + ASSERT_THAT(record.login_event().failure().reason(), + Eq(LoginFailureReason::INTERNAL_LOGIN_FAILURE_REASON)); +} + +INSTANTIATE_TEST_SUITE_P( + All, + LoginFailureReporterTest, + ::testing::Values<AuthFailure>( + AuthFailure(AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME), + AuthFailure(AuthFailure::DATA_REMOVAL_FAILED), + AuthFailure(AuthFailure::USERNAME_HASH_FAILED), + AuthFailure(AuthFailure::FAILED_TO_INITIALIZE_TOKEN))); + } // namespace reporting } // namespace ash
diff --git a/chrome/browser/ash/net/network_health/network_health.cc b/chrome/browser/ash/net/network_health/network_health.cc index 405a79c6..3476f6c 100644 --- a/chrome/browser/ash/net/network_health/network_health.cc +++ b/chrome/browser/ash/net/network_health/network_health.cc
@@ -161,10 +161,6 @@ RequestNetworkStateList(); } -void NetworkHealth::OnVpnProvidersChanged() {} - -void NetworkHealth::OnNetworkCertificatesChanged() {} - void NetworkHealth::OnNetworkStateListReceived( std::vector<network_config::mojom::NetworkStatePropertiesPtr> props) { network_properties_.swap(props);
diff --git a/chrome/browser/ash/net/network_health/network_health.h b/chrome/browser/ash/net/network_health/network_health.h index fbd0f41..4e333bb 100644 --- a/chrome/browser/ash/net/network_health/network_health.h +++ b/chrome/browser/ash/net/network_health/network_health.h
@@ -55,8 +55,9 @@ void OnNetworkStateChanged( chromeos::network_config::mojom::NetworkStatePropertiesPtr network_state) override; - void OnVpnProvidersChanged() override; - void OnNetworkCertificatesChanged() override; + void OnVpnProvidersChanged() override {} + void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} // Signal strength changes larger than // |kMaxSignalStrengthFluctuationTolerance| trigger a signal strength change
diff --git a/chrome/browser/ash/net/traffic_counters_handler.h b/chrome/browser/ash/net/traffic_counters_handler.h index e181ba1..a1525666a 100644 --- a/chrome/browser/ash/net/traffic_counters_handler.h +++ b/chrome/browser/ash/net/traffic_counters_handler.h
@@ -51,6 +51,7 @@ override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} void SetTimeGetterForTest(TimeGetter time_getter); void RunForTesting();
diff --git a/chrome/browser/ash/printing/cups_printers_manager.cc b/chrome/browser/ash/printing/cups_printers_manager.cc index da5a1b9e..0b20434 100644 --- a/chrome/browser/ash/printing/cups_printers_manager.cc +++ b/chrome/browser/ash/printing/cups_printers_manager.cc
@@ -310,6 +310,7 @@ void OnDeviceStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} // Callback for PrinterDetectors. void OnPrintersFound(
diff --git a/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc b/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc index b7413f1..7c3ae48 100644 --- a/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc +++ b/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc
@@ -17,7 +17,6 @@ namespace { -using testing::_; using testing::Eq; using testing::NotNull; using testing::Return; @@ -183,20 +182,20 @@ wrong_account_key->id = "user2"; wrong_account_key->account_type = crosapi::mojom::AccountType::kGaia; - EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey(_)).Times(0); + EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey).Times(0); client()->SetDecryptionNigoriKey(std::move(wrong_account_key), MakeTestMojoNigoriKey()); } TEST_F(SyncExplicitPassphraseClientAshTest, ShouldHandleNullKeyWhenSettingDecryptionKey) { - EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey(_)).Times(0); + EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey).Times(0); client()->SetDecryptionNigoriKey(GetSyncingAccountKey(), nullptr); } TEST_F(SyncExplicitPassphraseClientAshTest, ShouldHandleInvalidKeyWhenSettingDecryptionKey) { - EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey(_)).Times(0); + EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey).Times(0); crosapi::mojom::NigoriKeyPtr mojo_nigori_key = crosapi::mojom::NigoriKey::New(); @@ -204,7 +203,7 @@ mojo_nigori_key->encryption_key = {1, 2, 3}; mojo_nigori_key->mac_key = {1, 2, 3}; - EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey(_)).Times(0); + EXPECT_CALL(*sync_user_settings(), SetDecryptionNigoriKey).Times(0); client()->SetDecryptionNigoriKey(GetSyncingAccountKey(), std::move(mojo_nigori_key)); }
diff --git a/chrome/browser/banners/android/BUILD.gn b/chrome/browser/banners/android/BUILD.gn index 9bd41edf..f2a987e 100644 --- a/chrome/browser/banners/android/BUILD.gn +++ b/chrome/browser/banners/android/BUILD.gn
@@ -66,6 +66,9 @@ "//components/browser_ui/bottomsheet/android:java", "//components/feature_engagement/public:public_java", "//components/infobars/android:java", + "//components/messages/android:java", + "//components/messages/android/internal:java", + "//components/messages/android/test:test_support_java", "//components/signin/public/android:signin_java_test_support", "//components/site_engagement/content/android:java", "//components/webapps/browser/android:java",
diff --git a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java index d259af64..50185b2 100644 --- a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java +++ b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
@@ -93,6 +93,11 @@ import org.chromium.components.infobars.InfoBar; import org.chromium.components.infobars.InfoBarAnimationListener; import org.chromium.components.infobars.InfoBarUiItem; +import org.chromium.components.messages.DismissReason; +import org.chromium.components.messages.MessageDispatcher; +import org.chromium.components.messages.MessageDispatcherProvider; +import org.chromium.components.messages.MessageIdentifier; +import org.chromium.components.messages.MessagesTestHelper; import org.chromium.components.site_engagement.SiteEngagementService; import org.chromium.components.webapps.AppBannerManager; import org.chromium.components.webapps.AppData; @@ -106,6 +111,7 @@ import org.chromium.content_public.browser.test.util.TouchCommon; import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.net.test.EmbeddedTestServer; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogProperties; import org.chromium.ui.modaldialog.ModalDialogProperties.ButtonType; import org.chromium.ui.modelutil.PropertyModel; @@ -119,7 +125,6 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -@Features.DisableFeatures({ChromeFeatureList.MESSAGES_FOR_ANDROID_INFRASTRUCTURE}) public class AppBannerManagerTest { @Rule public ChromeTabbedActivityTestRule mTabbedActivityTestRule = @@ -326,7 +331,7 @@ }); } - private void waitUntilAmbientBadgeInfoBarAppears( + private void waitUntilAmbientBadgePromptAppears( ChromeActivityTestRule<? extends ChromeActivity> rule) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_INFOBAR)) { CriteriaHelper.pollUiThread(() -> { @@ -335,6 +340,15 @@ Criteria.checkThat( infobars.get(0), Matchers.instanceOf(InstallableAmbientBadgeInfoBar.class)); }); + } else if (ChromeFeatureList.isEnabled( + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_MESSAGE)) { + WindowAndroid windowAndroid = rule.getActivity().getWindowAndroid(); + CriteriaHelper.pollUiThread(() -> { + Criteria.checkThat( + MessagesTestHelper.getMessageCount(windowAndroid), Matchers.is(1)); + Criteria.checkThat(MessagesTestHelper.getMessageIdentifier(windowAndroid, 0), + Matchers.is(MessageIdentifier.INSTALLABLE_AMBIENT_BADGE)); + }); } } @@ -372,7 +386,7 @@ resetEngagementForUrl(url, 10); rule.loadUrlInNewTab(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); navigateToUrlAndWaitForBannerManager(rule, url); - waitUntilAmbientBadgeInfoBarAppears(rule); + waitUntilAmbientBadgePromptAppears(rule); Tab tab = rule.getActivity().getActivityTab(); tapAndWaitForModalBanner(tab); @@ -389,7 +403,7 @@ rule.loadUrlInNewTab(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); navigateToUrlAndWaitForBannerManager(rule, url); waitUntilAppDetailsRetrieved(rule, 1); - waitUntilAmbientBadgeInfoBarAppears(rule); + waitUntilAmbientBadgePromptAppears(rule); Assert.assertEquals(mDetailsDelegate.mReferrer, expectedReferrer); final ChromeActivity activity = rule.getActivity(); @@ -426,7 +440,7 @@ waitUntilAppDetailsRetrieved(rule, 1); } - waitUntilAmbientBadgeInfoBarAppears(rule); + waitUntilAmbientBadgePromptAppears(rule); Tab tab = rule.getActivity().getActivityTab(); tapAndWaitForModalBanner(tab); @@ -722,8 +736,10 @@ @Test @MediumTest @Feature({"AppBanners"}) - @CommandLineFlags.Add("enable-features=" + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_INFOBAR) - public void testBlockedAmbientBadgeDoesNotAppearAgainForMonths() throws Exception { + @CommandLineFlags.Add({"enable-features=" + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_INFOBAR, + "disable-features=" + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_MESSAGE}) + public void + testBlockedAmbientBadgeDoesNotAppearAgainForMonths() throws Exception { // Visit a site that is a PWA. The ambient badge should show. String webBannerUrl = WebappTestPage.getServiceWorkerUrl(mTestServer); resetEngagementForUrl(webBannerUrl, 10); @@ -734,7 +750,7 @@ Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); - waitUntilAmbientBadgeInfoBarAppears(mTabbedActivityTestRule); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); // Explicitly dismiss the ambient badge. CriteriaHelper.pollUiThread(() -> listener.mDoneAnimating); @@ -756,7 +772,72 @@ // Waiting three months should allow the ambient badge to reappear. AppBannerManager.setTimeDeltaForTesting(91); new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); - waitUntilAmbientBadgeInfoBarAppears(mTabbedActivityTestRule); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); + + Assert.assertEquals( + 0, RecordHistogram.getHistogramTotalCountForTesting(INSTALL_PATH_HISTOGRAM_NAME)); + } + + @Test + @MediumTest + @Feature({"AppBanners"}) + @CommandLineFlags.Add({"enable-features=" + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_MESSAGE, + "disable-features=" + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_INFOBAR}) + public void + testBlockedAmbientBadgeDoesNotAppearAgainForMonths_Message() throws Exception { + // Visit a site that is a PWA. The ambient badge should show. + String webBannerUrl = WebappTestPage.getServiceWorkerUrl(mTestServer); + resetEngagementForUrl(webBannerUrl, 10); + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); + + WindowAndroid windowAndroid = mTabbedActivityTestRule.getActivity().getWindowAndroid(); + + // Explicitly dismiss the ambient badge. + CriteriaHelper.pollUiThread( + () + -> Criteria.checkThat( + MessagesTestHelper.getMessageCount(windowAndroid), Matchers.is(1))); + + MessageDispatcher dispatcher = TestThreadUtils.runOnUiThreadBlocking( + () -> MessageDispatcherProvider.from(windowAndroid)); + PropertyModel model = TestThreadUtils.runOnUiThreadBlocking( + () + -> MessagesTestHelper.getCurrentMessage( + MessagesTestHelper + .getEnqueuedMessages(dispatcher, + MessageIdentifier.INSTALLABLE_AMBIENT_BADGE) + .get(0))); + TestThreadUtils.runOnUiThreadBlocking( + () -> { dispatcher.dismissMessage(model, DismissReason.GESTURE); }); + CriteriaHelper.pollUiThread( + () + -> Criteria.checkThat( + MessagesTestHelper.getMessageCount(windowAndroid), Matchers.is(0))); + + // Waiting two months shouldn't be long enough. + AppBannerManager.setTimeDeltaForTesting(61); + new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); + CriteriaHelper.pollUiThread( + () + -> Criteria.checkThat( + MessagesTestHelper.getMessageCount(windowAndroid), Matchers.is(0))); + + AppBannerManager.setTimeDeltaForTesting(62); + new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); + CriteriaHelper.pollUiThread( + () + -> Criteria.checkThat( + MessagesTestHelper.getMessageCount(windowAndroid), Matchers.is(0))); + + // Waiting three months should allow the ambient badge to reappear. + AppBannerManager.setTimeDeltaForTesting(91); + new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); + CriteriaHelper.pollUiThread( + () + -> Criteria.checkThat( + MessagesTestHelper.getMessageCount(windowAndroid), Matchers.is(1))); Assert.assertEquals( 0, RecordHistogram.getHistogramTotalCountForTesting(INSTALL_PATH_HISTOGRAM_NAME)); @@ -989,8 +1070,10 @@ @Test @MediumTest @Feature({"AppBanners"}) - @CommandLineFlags.Add({"enable-features=" + FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE, - "disable-features=" + ChromeFeatureList.ADD_TO_HOMESCREEN_IPH}) + @CommandLineFlags.Add({"enable-features=" + FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE + "," + + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_INFOBAR, + "disable-features=" + ChromeFeatureList.ADD_TO_HOMESCREEN_IPH + "," + + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_MESSAGE}) @Features.DisableFeatures(ChromeFeatureList.SNOOZABLE_IPH) public void testInProductHelp() throws Exception { @@ -1004,7 +1087,43 @@ Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); - waitUntilAmbientBadgeInfoBarAppears(mTabbedActivityTestRule); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); + + waitForHelpBubble(withText(R.string.iph_pwa_install_available_text)).perform(click()); + assertThat(mTracker.wasDismissed(), is(true)); + + int callCount = mOnEventCallback.getCallCount(); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + AppMenuCoordinator coordinator = mTabbedActivityTestRule.getAppMenuCoordinator(); + AppMenuTestSupport.showAppMenu(coordinator, null, false); + AppMenuTestSupport.callOnItemClick(coordinator, R.id.add_to_homescreen_id); + }); + mOnEventCallback.waitForCallback(callCount, 1); + + assertThat(mTracker.getLastEvent(), is(EventConstants.PWA_INSTALL_MENU_SELECTED)); + + Assert.assertEquals( + 0, RecordHistogram.getHistogramTotalCountForTesting(INSTALL_PATH_HISTOGRAM_NAME)); + } + + @Test + @MediumTest + @Feature({"AppBanners"}) + @CommandLineFlags.Add({"enable-features=" + FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE + "," + + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_MESSAGE, + "disable-features=" + ChromeFeatureList.ADD_TO_HOMESCREEN_IPH + "," + + ChromeFeatureList.INSTALLABLE_AMBIENT_BADGE_INFOBAR}) + @Features.DisableFeatures(ChromeFeatureList.SNOOZABLE_IPH) + public void + testInProductHelp_Message() throws Exception { + // Visit a site that is a PWA. The ambient badge should show. + String webBannerUrl = WebappTestPage.getServiceWorkerUrl(mTestServer); + resetEngagementForUrl(webBannerUrl, 10); + + Tab tab = mTabbedActivityTestRule.getActivity().getActivityTab(); + new TabLoadObserver(tab).fullyLoadUrl(webBannerUrl); + waitUntilAmbientBadgePromptAppears(mTabbedActivityTestRule); waitForHelpBubble(withText(R.string.iph_pwa_install_available_text)).perform(click()); assertThat(mTracker.wasDismissed(), is(true));
diff --git a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc index bad018b..8f2064b 100644 --- a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc +++ b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
@@ -28,9 +28,12 @@ namespace { // Open 'chrome://browser-switch/?url=...' in the current tab. -void OpenBrowserSwitchPage(content::WebContents* web_contents, +void OpenBrowserSwitchPage(base::WeakPtr<content::WebContents> web_contents, const GURL& url, ui::PageTransition transition_type) { + if (!web_contents) + return; + GURL about_url(chrome::kChromeUIBrowserSwitchURL); about_url = net::AppendQueryParameter(about_url, "url", url.spec()); content::OpenURLParams params(about_url, content::Referrer(), @@ -71,7 +74,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&OpenBrowserSwitchPage, - base::Unretained(navigation_handle->GetWebContents()), url, + navigation_handle->GetWebContents()->GetWeakPtr(), url, navigation_handle->GetPageTransition())); return true; }
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index 5210bc5..18d0e06b 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -92,6 +92,7 @@ #include "components/content_settings/core/browser/website_settings_registry.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_pattern.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/custom_handlers/protocol_handler_registry.h" #include "components/custom_handlers/test_protocol_handler_registry_delegate.h" #include "components/domain_reliability/clear_mode.h" @@ -2345,10 +2346,10 @@ base::Time one_hour_ago = base::Time::Now() - base::Hours(1); base::Time yesterday = base::Time::Now() - base::Days(1); registry->OnAcceptRegisterProtocolHandler( - content::ProtocolHandler::CreateProtocolHandler("news", kOrigin)); - registry->OnAcceptRegisterProtocolHandler( - content::ProtocolHandler("mailto", kOrigin, yesterday, - blink::ProtocolHandlerSecurityLevel::kStrict)); + custom_handlers::ProtocolHandler::CreateProtocolHandler("news", kOrigin)); + registry->OnAcceptRegisterProtocolHandler(custom_handlers::ProtocolHandler( + "mailto", kOrigin, yesterday, + blink::ProtocolHandlerSecurityLevel::kStrict)); EXPECT_TRUE(registry->IsHandledProtocol("news")); EXPECT_TRUE(registry->IsHandledProtocol("mailto")); EXPECT_EQ(
diff --git a/chrome/browser/browsing_data/counters/site_settings_counter.cc b/chrome/browser/browsing_data/counters/site_settings_counter.cc index 6f6904f5..dcd5674 100644 --- a/chrome/browser/browsing_data/counters/site_settings_counter.cc +++ b/chrome/browser/browsing_data/counters/site_settings_counter.cc
@@ -10,6 +10,7 @@ #include "components/browsing_data/core/pref_names.h" #include "components/content_settings/core/browser/content_settings_registry.h" #include "components/content_settings/core/common/content_settings_pattern.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/custom_handlers/protocol_handler_registry.h" #if !BUILDFLAG(IS_ANDROID) @@ -99,7 +100,7 @@ auto handlers = handler_registry_->GetUserDefinedHandlers(period_start, period_end); - for (const ProtocolHandler& handler : handlers) + for (const custom_handlers::ProtocolHandler& handler : handlers) hosts.insert(handler.url().host()); std::vector<std::string> never_prompt_sites =
diff --git a/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc b/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc index d6a34d5..e8bfdc6 100644 --- a/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc +++ b/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc
@@ -19,16 +19,20 @@ #include "chrome/test/base/testing_profile.h" #include "components/browsing_data/core/browsing_data_utils.h" #include "components/browsing_data/core/pref_names.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/custom_handlers/protocol_handler_registry.h" #include "components/custom_handlers/test_protocol_handler_registry_delegate.h" #include "components/prefs/pref_service.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/security/protocol_handler_security_level.h" #if !BUILDFLAG(IS_ANDROID) #include "content/public/browser/host_zoom_map.h" #endif +using custom_handlers::ProtocolHandler; + namespace { class SiteSettingsCounterTest : public testing::Test {
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 10db96e..beadf46b 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -188,6 +188,8 @@ #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "ash/services/multidevice_setup/multidevice_setup_service.h" #include "ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h" #include "ash/webui/camera_app_ui/camera_app_helper.mojom.h" @@ -258,8 +260,6 @@ #include "chrome/browser/ui/webui/settings/chromeos/search/user_action_recorder.mojom.h" #include "chromeos/components/local_search_service/public/mojom/index.mojom.h" #include "chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom.h" -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" // nogncheck #include "chromeos/services/network_health/public/mojom/network_diagnostics.mojom.h" // nogncheck #include "chromeos/services/network_health/public/mojom/network_health.mojom.h" // nogncheck
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc index fdce772..da403ef 100644 --- a/chrome/browser/chrome_content_browser_client_browsertest.cc +++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -32,6 +32,7 @@ #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/custom_handlers/protocol_handler_registry.h" #include "components/network_session_configurator/common/network_switches.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" @@ -458,8 +459,8 @@ void AddProtocolHandler(const std::string& scheme, const std::string& redirect_template) { protocol_handler_registry()->OnAcceptRegisterProtocolHandler( - ProtocolHandler::CreateProtocolHandler(scheme, - GURL(redirect_template))); + custom_handlers::ProtocolHandler::CreateProtocolHandler( + scheme, GURL(redirect_template))); } custom_handlers::ProtocolHandlerRegistry* protocol_handler_registry() {
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 3c2184ff..75360a6 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -72,6 +72,7 @@ #include "chrome/browser/ash/borealis/borealis_metrics.h" #include "chrome/browser/ash/borealis/borealis_service.h" #include "chrome/browser/ash/crosapi/automation_ash.h" +#include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/crosapi/crosapi_ash.h" #include "chrome/browser/ash/crosapi/crosapi_manager.h" #include "chrome/browser/ash/crostini/crostini_export_import.h" @@ -1886,6 +1887,20 @@ } /////////////////////////////////////////////////////////////////////////////// +// AutotestPrivateIsLacrosPrimaryBrowserFunction +/////////////////////////////////////////////////////////////////////////////// + +AutotestPrivateIsLacrosPrimaryBrowserFunction:: + ~AutotestPrivateIsLacrosPrimaryBrowserFunction() = default; + +ExtensionFunction::ResponseAction +AutotestPrivateIsLacrosPrimaryBrowserFunction::Run() { + DVLOG(1) << "AutotestPrivateIsLacrosPrimaryBrowserFunction"; + return RespondNow(OneArgument( + base::Value(crosapi::browser_util::IsLacrosPrimaryBrowser()))); +} + +/////////////////////////////////////////////////////////////////////////////// // AutotestPrivateGetArcPackageFunction ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h index 863fe4b3d..24127d1 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -301,6 +301,16 @@ ResponseAction Run() override; }; +class AutotestPrivateIsLacrosPrimaryBrowserFunction : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("autotestPrivate.isLacrosPrimaryBrowser", + AUTOTESTPRIVATE_ISLACROSPRIMARYBROWSER) + + private: + ~AutotestPrivateIsLacrosPrimaryBrowserFunction() override; + ResponseAction Run() override; +}; + class AutotestPrivateGetArcAppFunction : public ExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("autotestPrivate.getArcApp",
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc index 022ecec2..fec123b 100644 --- a/chrome/browser/client_hints/client_hints_browsertest.cc +++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -61,6 +61,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" +#include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" #include "content/public/test/url_loader_interceptor.h" #include "net/base/features.h" @@ -71,6 +72,7 @@ #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" +#include "net/url_request/url_request.h" #include "services/network/public/cpp/client_hints.h" #include "services/network/public/cpp/cors/cors.h" #include "services/network/public/cpp/features.h" @@ -1187,6 +1189,54 @@ content::AcceptCHFrameRestart::kNavigationRestarted, 1); } +IN_PROC_BROWSER_TEST_F(ClientHintsBrowserTest, ClientHintsAlpsRestartLimit) { + net::test_server::EmbeddedTestServer server_1( + net::EmbeddedTestServer::TYPE_HTTPS, + net::test_server::HttpConnection::Protocol::kHttp2); + net::test_server::EmbeddedTestServer server_2( + net::EmbeddedTestServer::TYPE_HTTPS, + net::test_server::HttpConnection::Protocol::kHttp2); + + server_1.RegisterRequestHandler(base::BindLambdaForTesting( + [&](const net::test_server::HttpRequest& request) + -> std::unique_ptr<net::test_server::HttpResponse> { + auto http_response = + std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_TEMPORARY_REDIRECT); + http_response->AddCustomHeader("Location", server_2.GetURL("/").spec()); + return http_response; + })); + server_2.RegisterRequestHandler(base::BindLambdaForTesting( + [&](const net::test_server::HttpRequest& request) + -> std::unique_ptr<net::test_server::HttpResponse> { + auto http_response = + std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_TEMPORARY_REDIRECT); + http_response->AddCustomHeader("Location", server_1.GetURL("/").spec()); + return http_response; + })); + + server_1.SetAlpsAcceptCH("", "sec-ch-ua-arch"); + server_2.SetAlpsAcceptCH("", "sec-ch-ua-arch"); + + ASSERT_TRUE(server_1.Start()); + ASSERT_TRUE(server_2.Start()); + + base::HistogramTester histogram_tester; + content::TestNavigationObserver nav_observer( + browser()->tab_strip_model()->GetActiveWebContents(), 1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), server_1.GetURL("/"))); + histogram_tester.ExpectBucketCount( + "ClientHints.AcceptCHFrame", + content::AcceptCHFrameRestart::kNavigationRestarted, + net::URLRequest::kMaxRedirects); + histogram_tester.ExpectBucketCount( + "ClientHints.AcceptCHFrame", + content::AcceptCHFrameRestart::kRedirectOverflow, 1); + EXPECT_EQ(net::ERR_TOO_MANY_ACCEPT_CH_RESTARTS, + nav_observer.last_net_error_code()); +} + IN_PROC_BROWSER_TEST_F(ClientHintsBrowserTest, ClientHintsAlpsNavigationPreload) { SetClientHintExpectationsOnMainFrame(true);
diff --git a/chrome/browser/content_settings/page_specific_content_settings_delegate.h b/chrome/browser/content_settings/page_specific_content_settings_delegate.h index fe3e84e4..3d152dbf 100644 --- a/chrome/browser/content_settings/page_specific_content_settings_delegate.h +++ b/chrome/browser/content_settings/page_specific_content_settings_delegate.h
@@ -8,12 +8,10 @@ #include "build/build_config.h" #include "chrome/browser/browsing_data/access_context_audit_service.h" #include "components/content_settings/browser/page_specific_content_settings.h" -#include "content/public/common/custom_handlers/protocol_handler.h" +#include "components/custom_handlers/protocol_handler.h" namespace chrome { -using content::ProtocolHandler; - class PageSpecificContentSettingsDelegate : public content_settings::PageSpecificContentSettings::Delegate, public content::WebContentsObserver { @@ -30,25 +28,28 @@ content::WebContents* web_contents); // Call to indicate that there is a protocol handler pending user approval. - void set_pending_protocol_handler(const ProtocolHandler& handler) { + void set_pending_protocol_handler( + const custom_handlers::ProtocolHandler& handler) { pending_protocol_handler_ = handler; } - const ProtocolHandler& pending_protocol_handler() const { + const custom_handlers::ProtocolHandler& pending_protocol_handler() const { return pending_protocol_handler_; } void ClearPendingProtocolHandler() { - pending_protocol_handler_ = ProtocolHandler::EmptyProtocolHandler(); + pending_protocol_handler_ = + custom_handlers::ProtocolHandler::EmptyProtocolHandler(); } // Sets the previous protocol handler which will be replaced by the // pending protocol handler. - void set_previous_protocol_handler(const ProtocolHandler& handler) { + void set_previous_protocol_handler( + const custom_handlers::ProtocolHandler& handler) { previous_protocol_handler_ = handler; } - const ProtocolHandler& previous_protocol_handler() const { + const custom_handlers::ProtocolHandler& previous_protocol_handler() const { return previous_protocol_handler_; } @@ -101,14 +102,14 @@ // registerProtocolHandler was invoked without user gesture. // The |IsEmpty| method will be true if no protocol handler is // pending registration. - ProtocolHandler pending_protocol_handler_ = - ProtocolHandler::EmptyProtocolHandler(); + custom_handlers::ProtocolHandler pending_protocol_handler_ = + custom_handlers::ProtocolHandler::EmptyProtocolHandler(); // The previous protocol handler to be replaced by // the pending_protocol_handler_, if there is one. Empty if // there is no handler which would be replaced. - ProtocolHandler previous_protocol_handler_ = - ProtocolHandler::EmptyProtocolHandler(); + custom_handlers::ProtocolHandler previous_protocol_handler_ = + custom_handlers::ProtocolHandler::EmptyProtocolHandler(); // The setting on the pending protocol handler registration. Persisted in case // the user opens the bubble and makes changes multiple times.
diff --git a/chrome/browser/custom_handlers/chrome_protocol_handler_registry_unittest.cc b/chrome/browser/custom_handlers/chrome_protocol_handler_registry_unittest.cc index b3b36c7..13dff836 100644 --- a/chrome/browser/custom_handlers/chrome_protocol_handler_registry_unittest.cc +++ b/chrome/browser/custom_handlers/chrome_protocol_handler_registry_unittest.cc
@@ -3,13 +3,15 @@ // found in the LICENSE file. #include "chrome/test/base/testing_profile.h" +#include "components/custom_handlers/protocol_handler.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/custom_handlers/test_protocol_handler_registry_delegate.h" #include "content/public/test/browser_task_environment.h" #include "extensions/buildflags/buildflags.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/security/protocol_handler_security_level.h" -using content::ProtocolHandler; +using custom_handlers::ProtocolHandler; using custom_handlers::ProtocolHandlerRegistry; class ChromeProtocolHandlerRegistryTest : public testing::Test {
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc index c557769..b6f42d7 100644 --- a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc +++ b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -17,6 +17,8 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/custom_handlers/protocol_handler.h" +#include "components/custom_handlers/protocol_handler_registry.h" #include "components/permissions/permission_request_manager.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" @@ -33,6 +35,7 @@ #endif using content::WebContents; +using custom_handlers::ProtocolHandler; using custom_handlers::ProtocolHandlerRegistry; namespace {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java index 2f9bb167..53d000e 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
@@ -11,6 +11,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; import android.widget.FrameLayout; import androidx.annotation.Nullable; @@ -149,6 +150,10 @@ // sheet is closed. This is to fix the problem that the last focused view is not // restored after opening and closing the bottom sheet. mLastFocusedView = mActivity.getCurrentFocus(); + // If the talkback is enabled, also remember the accessibility focused view, which may + // be different from the focused view, so that we can get back to it once the bottom + // sheet is closed. + mLastAccessibilityFocusedView = findAccessibilityFocus(actionSourceView); // Make a sheetContent with the view. mBottomSheetContent = new CardMenuBottomSheetContent(view); @@ -156,9 +161,15 @@ mBottomSheetController.addObserver(new EmptyBottomSheetObserver() { @Override public void onSheetClosed(@StateChangeReason int reason) { - if (mLastFocusedView == null) return; - mLastFocusedView.requestFocus(); - mLastFocusedView = null; + if (mLastFocusedView != null) { + mLastFocusedView.requestFocus(); + mLastFocusedView = null; + } + if (mLastAccessibilityFocusedView != null) { + mLastAccessibilityFocusedView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_FOCUSED); + mLastAccessibilityFocusedView = null; + } } }); mBottomSheetController.requestShowContent(mBottomSheetContent, true); @@ -169,6 +180,21 @@ FeedStream.this.dismissBottomSheet(); } + /** + * Search the view hierarchy to find the accessibility focused view. + */ + private View findAccessibilityFocus(View view) { + if (view == null || view.isAccessibilityFocused()) return view; + if (!(view instanceof ViewGroup)) return null; + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); ++i) { + View childView = viewGroup.getChildAt(i); + View focusedView = findAccessibilityFocus(childView); + if (focusedView != null) return focusedView; + } + return null; + } + private void openSuggestionUrl(String url, int disposition) { boolean inNewTab = (disposition == WindowOpenDisposition.NEW_BACKGROUND_TAB || disposition == WindowOpenDisposition.OFF_THE_RECORD); @@ -433,6 +459,7 @@ private BottomSheetContent mBottomSheetContent; private String mBottomSheetOriginatingSliceId; private View mLastFocusedView; + private View mLastAccessibilityFocusedView; /** * Creates a new Feed Stream.
diff --git a/chrome/browser/first_run/first_run_internal_win.cc b/chrome/browser/first_run/first_run_internal_win.cc index 7bcf0cf..eb61490 100644 --- a/chrome/browser/first_run/first_run_internal_win.cc +++ b/chrome/browser/first_run/first_run_internal_win.cc
@@ -90,7 +90,7 @@ // true if successful. bool WriteEULAtoTempFile(base::FilePath* eula_path) { std::string terms = - ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( + ui::ResourceBundle::GetSharedInstance().LoadLocalizedResourceString( IDS_TERMS_HTML); return (!terms.empty() && base::CreateTemporaryFile(eula_path) &&
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 1491179..3a029ef 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -371,6 +371,7 @@ &switches::kSyncUseSessionsUnregisterDelay, &subresource_filter::kSafeBrowsingSubresourceFilter, &video_tutorials::features::kVideoTutorials, + &webapps::features::kInstallableAmbientBadgeMessage, &webapps::features::kInstallableAmbientBadgeInfoBar, };
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 84edac89..fb8caca 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -367,6 +367,7 @@ "IncognitoReauthenticationForAndroid"; public static final String INCOGNITO_SCREENSHOT = "IncognitoScreenshot"; public static final String INSTALLABLE_AMBIENT_BADGE_INFOBAR = "InstallableAmbientBadgeInfoBar"; + public static final String INSTALLABLE_AMBIENT_BADGE_MESSAGE = "InstallableAmbientBadgeMessage"; public static final String INSTANCE_SWITCHER = "InstanceSwitcher"; public static final String INSTANT_START = "InstantStart"; public static final String INTEREST_FEEDV1_CLICKS_AND_VIEWS_CONDITIONAL_UPLOAD =
diff --git a/chrome/browser/lacros/cert_db_initializer_browsertest.cc b/chrome/browser/lacros/cert_db_initializer_browsertest.cc index 9b8f0ad95..edaf1f24 100644 --- a/chrome/browser/lacros/cert_db_initializer_browsertest.cc +++ b/chrome/browser/lacros/cert_db_initializer_browsertest.cc
@@ -17,12 +17,17 @@ #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/crosapi/cpp/keystore_service_util.h" +#include "chromeos/lacros/lacros_service.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/storage_partition.h" #include "content/public/test/browser_test.h" +#include "net/cert/cert_database.h" #include "net/cert/nss_cert_database.h" #include "net/cert/x509_certificate.h" +#include "net/cert/x509_util.h" #include "net/cert/x509_util_nss.h" +#include "net/test/cert_builder.h" #include "net/test/cert_test_util.h" #include "services/network/public/mojom/network_context.mojom.h" @@ -122,6 +127,54 @@ return future.Get(); } +// Generates an x509 client certificate for the `public_key_spki` and returns it +// as a DER-encoded certificate. +[[nodiscard]] std::vector<uint8_t> GenerateClientCertForPublicKey( + const std::vector<uint8_t>& public_key_spki) { + auto cert_builder = net::CertBuilder::FromSubjectPublicKeyInfo( + public_key_spki, + /*issuer=*/new net::CertBuilder(/*orig_cert=*/nullptr, + /*issuer=*/nullptr)); + cert_builder->SetSignatureAlgorithmRsaPkca1(net::DigestAlgorithm::Sha256); + cert_builder->SetValidity(base::Time::Now(), + base::Time::Now() + base::Days(30)); + + auto scoped_cert = cert_builder->GetX509Certificate(); + auto cert_span = + net::x509_util::CryptoBufferAsSpan(scoped_cert->cert_buffer()); + return std::vector<uint8_t>(cert_span.begin(), cert_span.end()); +} + +// Observes notifications about cert database changes during its lifetime. +class ScopedCertDatabaseObserver : public net::CertDatabase::Observer { + public: + ScopedCertDatabaseObserver() { + net::CertDatabase::GetInstance()->AddObserver(this); + } + ~ScopedCertDatabaseObserver() override { + net::CertDatabase::GetInstance()->RemoveObserver(this); + } + + void OnCertDBChanged() override { + notifications_received_++; + run_loop_.Quit(); + } + + // Waits for the next CertDBChanged notification if none were observed so far. + // Returns the amount of notifications received since creation. The counter is + // mostly used to detect unexpected notifications that could cause flakiness / + // false positives. + size_t Wait() { + // Noop if Quit() was ever called. + run_loop_.Run(); + return notifications_received_; + } + + private: + size_t notifications_received_ = 0; + base::RunLoop run_loop_; +}; + class CertDbInitializerTest : public InProcessBrowserTest { public: void SetUp() override { @@ -174,4 +227,60 @@ EXPECT_EQ(net::OK, VerifyServerCert(browser()->profile())); } +// Tests that when Ash imports a new certificate, Lacros receives a +// notification about it. +IN_PROC_BROWSER_TEST_F(CertDbInitializerTest, + DISABLED_CertsChangedNotificationFromAsh) { + auto& keystore_crosapi = chromeos::LacrosService::Get() + ->GetRemote<crosapi::mojom::KeystoreService>(); + + // This test uses the Keystore mojo API to make Ash import a cert. Ash will + // only successfully import a cert if it owns a key pair associated with it. + // This call generates a new key pair. + base::test::TestFuture<crosapi::mojom::KeystoreBinaryResultPtr> + generate_key_result; + keystore_crosapi->GenerateKey( + crosapi::mojom::KeystoreType::kUser, + crosapi::keystore_service_util::MakeRsaKeystoreSigningAlgorithm( + /*modulus_length=*/2048, /*sw_backed=*/false), + generate_key_result.GetCallback()); + ASSERT_FALSE(generate_key_result.Get()->is_error()); + + std::vector<uint8_t> client_cert = + GenerateClientCertForPublicKey(generate_key_result.Get()->get_blob()); + + ScopedCertDatabaseObserver observer; + + // Generate and import a certificate. + base::test::TestFuture<bool /*is_error*/, crosapi::mojom::KeystoreError> + add_cert_result; + keystore_crosapi->AddCertificate(crosapi::mojom::KeystoreType::kUser, + client_cert, add_cert_result.GetCallback()); + ASSERT_FALSE(add_cert_result.Get<0>()) + << "Error: " << add_cert_result.Get<1>(); + + // Wait for the notification from Ash about cert database changes. + // If there are more than one, most likely there are other sources of changes + // in the background and the test should be rewritten somehow. + EXPECT_EQ(1u, observer.Wait()); + + // Check that the cert was actually imported. + base::test::TestFuture<crosapi::mojom::GetCertificatesResultPtr> + get_certs_result; + keystore_crosapi->GetCertificates(crosapi::mojom::KeystoreType::kUser, + get_certs_result.GetCallback()); + ASSERT_FALSE(get_certs_result.Get()->is_error()); + EXPECT_TRUE( + base::Contains(get_certs_result.Get()->get_certificates(), client_cert)); +} + +// TODO(b/191336682): Add a test similar to CertsChangedNotificationFromAsh, but +// about system keystore. Right now system slot is not available/emulated in +// lacros browser tests. + +// For a test that covers notifications in Ash when Lacros changes the database, +// see network.CertSettingsPage tast test. Such a browser test could be written +// by adding new methods into crosapi.TestController, but their implementation +// would have a similar complexity to the notification mechanism itself. + } // namespace
diff --git a/chrome/browser/lacros/crosapi_pref_observer_lacros_browsertest.cc b/chrome/browser/lacros/crosapi_pref_observer_lacros_browsertest.cc index 801294a..9fae07c3 100644 --- a/chrome/browser/lacros/crosapi_pref_observer_lacros_browsertest.cc +++ b/chrome/browser/lacros/crosapi_pref_observer_lacros_browsertest.cc
@@ -5,8 +5,8 @@ #include "base/run_loop.h" #include "base/test/bind.h" #include "base/values.h" -#include "chrome/browser/lacros/crosapi_pref_observer.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/lacros/crosapi_pref_observer.h" #include "content/public/test/browser_test.h" using CrosapiPrefObserverLacrosBrowserTest = InProcessBrowserTest;
diff --git a/chrome/browser/lacros/prefs_ash_observer.h b/chrome/browser/lacros/prefs_ash_observer.h index 87f00274..2b8b838e 100644 --- a/chrome/browser/lacros/prefs_ash_observer.h +++ b/chrome/browser/lacros/prefs_ash_observer.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/gtest_prod_util.h" -#include "chrome/browser/lacros/crosapi_pref_observer.h" +#include "chromeos/lacros/crosapi_pref_observer.h" #include "components/prefs/pref_service.h" // Observes ash-chrome for changes in the secure DNS preferences.
diff --git a/chrome/browser/printing/print_preview_dialog_controller.cc b/chrome/browser/printing/print_preview_dialog_controller.cc index 332fbc2..d656cca 100644 --- a/chrome/browser/printing/print_preview_dialog_controller.cc +++ b/chrome/browser/printing/print_preview_dialog_controller.cc
@@ -372,17 +372,16 @@ ui::PageTransition type = details.entry->GetTransitionType(); // New |preview_dialog| is created. Don't update/erase map entry. - if (waiting_for_new_preview_page_ && + if (details.previous_main_frame_url.is_empty() && details.entry && + IsPrintPreviewURL(details.entry->GetURL()) && ui::PageTransitionCoreTypeIs(type, ui::PAGE_TRANSITION_AUTO_TOPLEVEL) && details.type == content::NAVIGATION_TYPE_MAIN_FRAME_NEW_ENTRY) { - waiting_for_new_preview_page_ = false; SaveInitiatorTitle(preview_dialog); return; } // Cloud print sign-in causes a reload. - if (!waiting_for_new_preview_page_ && - ui::PageTransitionCoreTypeIs(type, ui::PAGE_TRANSITION_RELOAD) && + if (ui::PageTransitionCoreTypeIs(type, ui::PAGE_TRANSITION_RELOAD) && details.type == content::NAVIGATION_TYPE_MAIN_FRAME_EXISTING_ENTRY && IsPrintPreviewURL(details.previous_main_frame_url)) { return; @@ -412,7 +411,6 @@ // Add an entry to the map. preview_dialog_map_[preview_dialog] = initiator; - waiting_for_new_preview_page_ = true; // Make the print preview WebContents show up in the task manager. task_manager::WebContentsTags::CreateForPrintingContents(preview_dialog);
diff --git a/chrome/browser/printing/print_preview_dialog_controller.h b/chrome/browser/printing/print_preview_dialog_controller.h index cdb82d5..9abf4aef 100644 --- a/chrome/browser/printing/print_preview_dialog_controller.h +++ b/chrome/browser/printing/print_preview_dialog_controller.h
@@ -125,10 +125,6 @@ WebContentsCollection web_contents_collection_; - // True if the controller is waiting for a new preview dialog via - // content::NAVIGATION_TYPE_NEW_ENTRY. - bool waiting_for_new_preview_page_ = false; - // Whether the PrintPreviewDialogController is in the middle of creating a // print preview dialog. bool is_creating_print_preview_dialog_ = false;
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java index 397ad00..85ba3790 100644 --- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java +++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java
@@ -17,6 +17,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.chromium.ui.test.util.ViewUtils.onViewWaiting; + import android.app.Dialog; import android.content.Context; import android.os.Bundle; @@ -109,6 +111,7 @@ } private void renderViewWithId(int id, String renderId) { + onViewWaiting(withId(id)); onView(withId(id)).check((v, noMatchException) -> { if (noMatchException != null) throw noMatchException; // Allow disk writes and slow calls to render from UI thread. @@ -147,6 +150,7 @@ mDialog = new PrivacySandboxDialogConsent(sActivityTestRule.getActivity()); mDialog.show(); }); + onViewWaiting(withId(R.id.privacy_sandbox_dialog)); onView(withId(R.id.dropdown_element)).perform(scrollTo(), click()); onView(withId(R.id.privacy_sandbox_consent_dropdown)).perform(scrollTo()); renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_consent_dialog_expanded");
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index e8c2cbeac..67d7beb 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -110,6 +110,7 @@ #include "chrome/grit/generated_resources.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/common/password_generation_util.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/download/public/common/download_url_parameters.h" #include "components/google/core/common/google_util.h" #include "components/guest_view/browser/guest_view_base.h"
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js index d43e95b..7238782 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js
@@ -39,10 +39,10 @@ this.localePref_ = ''; /** - * The state of Dictation. - * @private {!Dictation.DictationState} + * Whether or not Dictation is active. + * @private {boolean} */ - this.state_ = Dictation.DictationState.OFF; + this.active_ = false; /** @private {Audio} */ this.cancelTone_ = new Audio('dictation/earcons/null_selection.wav'); @@ -76,7 +76,8 @@ * @private */ initialize_() { - this.inputController_ = new InputController(() => this.stopDictation_()); + this.inputController_ = + new InputController(() => this.stopDictation_(/*notify=*/ true)); this.uiController_ = new UIController(); this.speechParser_ = new SpeechParser(this.inputController_); @@ -134,26 +135,19 @@ * @private */ onToggleDictation_(activated) { - if (activated && this.state_ === Dictation.DictationState.OFF) { - this.state_ = Dictation.DictationState.STARTING; - this.startTone_.play(); - this.setStopTimeout_(Dictation.Timeouts.NO_FOCUSED_IME_MS); - this.inputController_.connect(() => this.maybeStartSpeechRecognition_()); + if (activated && !this.active_) { + this.startDictation_(); } else { - this.onDictationStopped_(); + this.stopDictation_(/*notify=*/ false); } } - /** - * Sets the timeout to stop Dictation. - * @param {number} durationMs - * @private - */ - setStopTimeout_(durationMs) { - if (this.stopTimeoutId_ !== null) { - clearTimeout(this.stopTimeoutId_); - } - this.stopTimeoutId_ = setTimeout(() => this.stopDictation_(), durationMs); + /** @private */ + startDictation_() { + this.active_ = true; + this.startTone_.play(); + this.setStopTimeout_(Dictation.Timeouts.NO_FOCUSED_IME_MS); + this.inputController_.connect(() => this.maybeStartSpeechRecognition_()); } /** @@ -163,7 +157,7 @@ * @private */ maybeStartSpeechRecognition_() { - if (this.state_ === Dictation.DictationState.STARTING) { + if (this.active_) { chrome.speechRecognitionPrivate.start( /** @type {!StartOptions} */ (this.speechRecognitionOptions_), (type) => this.onSpeechRecognitionStarted_(type)); @@ -172,39 +166,23 @@ // We are no longer starting up - perhaps a stop came // through during the async callbacks. Ensure cleanup // by calling stopDictation_(). - this.stopDictation_(); + this.stopDictation_(/*notify=*/ true); } } /** - * Stops Dictation in the browser / ash if it wasn't already stopped. - * The Dictation extension should always use this method to stop Dictation - * to ensure that Browser/Ash knows that Dictation has stopped. When - * AccessibilityManager receives the toggleDictation signal it will call - * back through onDictationStopped_() for state cleanup. + * Stops Dictation and notifies the browser. + * @param {boolean} notify True if we should notify the browser that Dictation + * stopped. * @private */ - stopDictation_() { - if (this.state_ === Dictation.DictationState.OFF || - this.state_ === Dictation.DictationState.STOPPING) { + stopDictation_(notify) { + if (!this.active_) { return; } - chrome.accessibilityPrivate.toggleDictation(); - this.state_ = Dictation.DictationState.STOPPING; - } - - /** - * Called when Dictation has been toggled off. Cleans up IME, local state, - * and speech recognition. - * @private - */ - onDictationStopped_() { - if (this.state_ === Dictation.DictationState.OFF) { - return; - } - - this.state_ = Dictation.DictationState.OFF; + this.active_ = false; + // Stop speech recognition. chrome.speechRecognitionPrivate.stop({}, () => {}); if (this.inputController_.hasCompositionText() || this.interimText_) { this.endTone_.play(); @@ -221,6 +199,24 @@ } this.inputController_.disconnect(); Dictation.removeAsInputMethod(); + + // Notify the browser that Dictation turned off. + if (notify) { + chrome.accessibilityPrivate.toggleDictation(); + } + } + + /** + * Sets the timeout to stop Dictation. + * @param {number} durationMs + * @private + */ + setStopTimeout_(durationMs) { + if (this.stopTimeoutId_ !== null) { + clearTimeout(this.stopTimeoutId_); + } + this.stopTimeoutId_ = + setTimeout(() => this.stopDictation_(/*notify=*/ true), durationMs); } /** @@ -229,7 +225,7 @@ * @private */ async onSpeechRecognitionResult_(event) { - if (this.state_ !== Dictation.DictationState.LISTENING) { + if (!this.active_) { return; } @@ -304,16 +300,14 @@ // speechRecognitionPrivate.start() caused an error. When this happens, // the speech recognition private API will turn the associated recognizer // off. To align with this, we should call `stopDictation_`. - this.stopDictation_(); + this.stopDictation_(/*notify=*/ true); return; } - if (this.state_ !== Dictation.DictationState.STARTING) { - // We tried to stop during speech shutdown. + if (!this.active_) { return; } - this.state_ = Dictation.DictationState.LISTENING; this.clearInterimText_(); // Record metrics. @@ -337,7 +331,7 @@ this.metricsUtils_ = null; // Stop dictation if it wasn't already stopped. - this.stopDictation_(); + this.stopDictation_(/*notify=*/ true); } /** @@ -348,7 +342,7 @@ // TODO: Dictation does not surface speech recognition errors to the user. // Informing the user of errors, for example lack of network connection or a // missing microphone, would be a useful feature. - this.stopDictation_(); + this.stopDictation_(/*notify=*/ true); } /** @@ -498,17 +492,6 @@ } /** - * Dictation states. - * @enum {!string} - */ -Dictation.DictationState = { - OFF: 'OFF', - STARTING: 'STARTING', - LISTENING: 'LISTENING', - STOPPING: 'STOPPING', -}; - -/** * Dictation locale pref. * @type {string} * @const
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js index 7aad58d..b0b3795 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js
@@ -29,16 +29,10 @@ this.checkDictationImeInactive(); this.toggleDictationOn(1); - // Blur the input context. Dictation should get toggled off. + // Blur the input context. Speech recognition and Dictation should turn + // off. Dictation should immediately begin cleaning up state. this.mockInputIme.callOnBlur(1); assertFalse(this.mockAccessibilityPrivate.getDictationActive()); - // Speech recognition remains active until Dictation is toggled off. - assertTrue(this.mockSpeechRecognitionPrivate.isStarted()); - // Now that we've confirmed that Dictation JS tried to toggle Dictation, - // via AccessibilityPrivate, we can call the onToggleDictation - // callback as AccessibilityManager would do, to allow Dictation JS to - // clean up state. - this.toggleDictationOffFromA11yPrivate(); assertFalse(this.mockSpeechRecognitionPrivate.isStarted()); }); @@ -140,17 +134,12 @@ this.mockInputIme.callOnFocus(1); this.mockInputIme.callOnBlur(1); - // Speech recognition remains active until Dictation is toggled off. - assertTrue(this.mockSpeechRecognitionPrivate.isStarted()); - // Check that a request to toggle dictation off was sent. + // Check that dictation and speech recognition are both off. + assertFalse(this.mockSpeechRecognitionPrivate.isStarted()); assertFalse(this.mockAccessibilityPrivate.getDictationActive()); - // Speech recognition is active, although shutdown is already in - // progress. - this.mockSpeechRecognitionPrivate.fireMockOnResultEvent('kitties', true); - - // Complete toggle -- this is async so other things could have - // happened in the meantime. + // Complete toggle -- this event will be fired as a result of turning + // Dictation off. this.mockAccessibilityPrivate.callOnToggleDictation(false); assertFalse(this.mockSpeechRecognitionPrivate.isStarted());
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index 303de378..3426cfba3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -221,8 +221,7 @@ let selectedRange; let msg; - if (this.pageSel_ && this.pageSel_.isValid() && range.isValid() && - !opt_skipSettingSelection) { + if (this.pageSel_ && this.pageSel_.isValid() && range.isValid()) { // Suppress hints. o.withoutHints();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index 8a294528..0949016f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -1052,6 +1052,10 @@ mockFeedback.call(doCmd('toggleSelection')) .expectSpeech('simple', 'selected') + .call(doCmd('nextObject')) + .expectSpeech('doc', 'selected') + .call(doCmd('previousObject')) + .expectSpeech('doc', 'unselected') .call(doCmd('nextCharacter')) .expectSpeech('i', 'selected') .call(doCmd('previousCharacter'))
diff --git a/chrome/browser/resources/pdf/BUILD.gn b/chrome/browser/resources/pdf/BUILD.gn index 22840d7..9f5ef95 100644 --- a/chrome/browser/resources/pdf/BUILD.gn +++ b/chrome/browser/resources/pdf/BUILD.gn
@@ -171,8 +171,6 @@ output_dir = "$root_gen_dir/chrome" } -assert(enable_pdf, "enable_pdf check failed") - html_to_js("web_components") { js_files = pdf_webcomponents_files + print_preview_webcomponents_files + shared_webcomponents_files
diff --git a/chrome/browser/resources/pdf/bookmark_type.js b/chrome/browser/resources/pdf/bookmark_type.ts similarity index 71% rename from chrome/browser/resources/pdf/bookmark_type.js rename to chrome/browser/resources/pdf/bookmark_type.ts index b8f9b199b7..1155fe4 100644 --- a/chrome/browser/resources/pdf/bookmark_type.js +++ b/chrome/browser/resources/pdf/bookmark_type.ts
@@ -13,15 +13,13 @@ * * |children| is an array of the |Bookmark|s that are below this in a table of * contents tree - * structure. - * @typedef {{ - * title: string, - * page: (number | undefined), - * x: (number | undefined), - * y: (number | undefined), - * zoom: (number | undefined), - * uri: (string | undefined), - * children: !Array<!Bookmark> - * }} */ -export let Bookmark; +export type Bookmark = { + title: string, + children: Bookmark[], + page?: number, + x?: number, + y?: number, + zoom?: number, + uri?: string, +};
diff --git a/chrome/browser/resources/pdf/constants.js b/chrome/browser/resources/pdf/constants.js deleted file mode 100644 index fc35a4f6..0000000 --- a/chrome/browser/resources/pdf/constants.js +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @typedef {{ - * name: string, - * size: number, - * readable: boolean, - * }} - */ -export let Attachment; - -/** @enum {string} */ -export const DisplayAnnotationsAction = { - DISPLAY_ANNOTATIONS: 'display-annotations', - HIDE_ANNOTATIONS: 'hide-annotations', -}; - -/** - * @typedef {{ - * author: string, - * canSerializeDocument: boolean, - * creationDate: string, - * creator: string, - * fileSize: string, - * keywords: string, - * linearized: boolean, - * modDate: string, - * pageSize: string, - * producer: string, - * subject: string, - * title: string, - * version: string, - * }} - */ -export let DocumentMetadata; - -/** - * Enumeration of page fitting types. - * @enum {string} - */ -export const FittingType = { - NONE: 'none', - FIT_TO_PAGE: 'fit-to-page', - FIT_TO_WIDTH: 'fit-to-width', - FIT_TO_HEIGHT: 'fit-to-height', -}; - -/** - * @typedef {{ - * messageId: string, - * namedDestinationView: (string|undefined), - * pageNumber: number, - * }} - */ -export let NamedDestinationMessageData; - -/** - * Enumeration of save message request types. Must match `SaveRequestType` in - * pdf/pdf_view_plugin_base.h. - * @enum {number} - */ -export const SaveRequestType = { - ANNOTATION: 0, - ORIGINAL: 1, - EDITED: 2, -}; - -/** @typedef {{x: number, y: number}} */ -export let Point;
diff --git a/chrome/browser/resources/pdf/constants.ts b/chrome/browser/resources/pdf/constants.ts new file mode 100644 index 0000000..1ee92d6a --- /dev/null +++ b/chrome/browser/resources/pdf/constants.ts
@@ -0,0 +1,59 @@ +// 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. + +export type Attachment = { + name: string, + size: number, + readable: boolean, +}; + +export enum DisplayAnnotationsAction { + DISPLAY_ANNOTATIONS = 'display-annotations', + HIDE_ANNOTATIONS = 'hide-annotations', +} + +export type DocumentMetadata = { + author: string, + canSerializeDocument: boolean, + creationDate: string, + creator: string, + fileSize: string, + keywords: string, + linearized: boolean, + modDate: string, + pageSize: string, + producer: string, + subject: string, + title: string, + version: string, +}; + +/** Enumeration of page fitting types. */ +export enum FittingType { + NONE = 'none', + FIT_TO_PAGE = 'fit-to-page', + FIT_TO_WIDTH = 'fit-to-width', + FIT_TO_HEIGHT = 'fit-to-height', +} + +export type NamedDestinationMessageData = { + messageId: string, + pageNumber: number, + namedDestinationView?: string, +}; + +/** + * Enumeration of save message request types. Must match `SaveRequestType` in + * pdf/pdf_view_plugin_base.h. + */ +export enum SaveRequestType { + ANNOTATION, + ORIGINAL, + EDITED, +} + +export type Point = { + x: number, + y: number, +};
diff --git a/chrome/browser/resources/pdf/gesture_detector.js b/chrome/browser/resources/pdf/gesture_detector.ts similarity index 60% rename from chrome/browser/resources/pdf/gesture_detector.js rename to chrome/browser/resources/pdf/gesture_detector.ts index 266fd130..5beb74a6 100644 --- a/chrome/browser/resources/pdf/gesture_detector.js +++ b/chrome/browser/resources/pdf/gesture_detector.ts
@@ -5,107 +5,82 @@ import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js'; import {Point} from './constants.js'; -/** - * @typedef {{ - * type: string, - * detail: !PinchEventDetail, - * }} - */ -export let Gesture; +export type Gesture = { + type: string, + detail: PinchEventDetail, +}; -/** - * @typedef {{ - * center: !Point, - * direction: (string|undefined), - * scaleRatio: (?number|undefined), - * startScaleRatio: (?number|undefined), - * }} - */ -export let PinchEventDetail; +export type PinchEventDetail = { + center: Point, + direction?: string, + scaleRatio?: number|null, + startScaleRatio?: number|null, +}; // A class that listens for touch events and produces events when these // touches form gestures (e.g. pinching). export class GestureDetector { + private element_: HTMLElement; + private pinchStartEvent_: TouchEvent|null = null; + private lastTouchTouchesCount_: number = 0; + private lastEvent_: TouchEvent|null = null; + private isPresentationMode_: boolean = false; + /** - * @param {!Element} element The element to monitor for touch gestures. + * The scale relative to the start of the pinch when handling ctrl-wheels. + * null when there is no ongoing pinch. */ - constructor(element) { - /** @private {!Element} */ + private accumulatedWheelScale_: number|null = null; + + /** + * A timeout ID from setTimeout used for sending the pinchend event when + * handling ctrl-wheels. + */ + private wheelEndTimeout_: number|null = null; + private eventTarget_: EventTarget = new EventTarget(); + + /** @param element The element to monitor for touch gestures. */ + constructor(element: HTMLElement) { this.element_ = element; this.element_.addEventListener( - 'touchstart', - /** @type {function(!Event)} */ (this.onTouchStart_.bind(this)), + 'touchstart', (this.onTouchStart_.bind(this) as (p1: Event) => any), {passive: true}); - const boundOnTouch = - /** @type {function(!Event)} */ (this.onTouch_.bind(this)); + const boundOnTouch = (this.onTouch_.bind(this) as (p1: Event) => any); this.element_.addEventListener('touchmove', boundOnTouch, {passive: true}); this.element_.addEventListener('touchend', boundOnTouch, {passive: true}); this.element_.addEventListener( 'touchcancel', boundOnTouch, {passive: true}); this.element_.addEventListener( - 'wheel', - /** @type {function(!Event)} */ (this.onWheel_.bind(this)), - {passive: false}); + 'wheel', this.onWheel_.bind(this), {passive: false}); document.addEventListener( - 'contextmenu', e => this.handleContextMenuEvent_(e)); - - this.pinchStartEvent_ = null; - this.lastTouchTouchesCount_ = 0; - - /** @private {boolean} */ - this.isPresentationMode_ = false; - - /** @private {TouchEvent} */ - this.lastEvent_ = null; - - /** - * The scale relative to the start of the pinch when handling ctrl-wheels. - * null when there is no ongoing pinch. - * - * @private {?number} - */ - this.accumulatedWheelScale_ = null; - - /** - * A timeout ID from setTimeout used for sending the pinchend event when - * handling ctrl-wheels. - * - * @private {?number} - */ - this.wheelEndTimeout_ = null; - - /** @private {!EventTarget} */ - this.eventTarget_ = new EventTarget(); + 'contextmenu', this.handleContextMenuEvent_.bind(this)); } - /** @param {boolean} enabled */ - setPresentationMode(enabled) { + setPresentationMode(enabled: boolean) { this.isPresentationMode_ = enabled; } - /** @return {!EventTarget} */ - getEventTarget() { + getEventTarget(): EventTarget { return this.eventTarget_; } /** * Public for tests. - * @return {boolean} True if the last touch start was a two finger touch. + * @return True if the last touch start was a two finger touch. */ - wasTwoFingerTouch() { + wasTwoFingerTouch(): boolean { return this.lastTouchTouchesCount_ === 2; } /** * Call the relevant listeners with the given |PinchEventDetail|. - * @param {string} type The type of pinch event. - * @param {!PinchEventDetail} detail The event to notify the listeners of. - * @private + * @param type The type of pinch event. + * @param detail The event to notify the listeners of. */ - notify_(type, detail) { + private notify_(type: string, detail: PinchEventDetail) { // Adjust center into element-relative coordinates. const clientRect = this.element_.getBoundingClientRect(); detail.center = { @@ -116,12 +91,8 @@ this.eventTarget_.dispatchEvent(new CustomEvent(type, {detail})); } - /** - * The callback for touchstart events on the element. - * @param {!TouchEvent} event Touch event on the element. - * @private - */ - onTouchStart_(event) { + /** The callback for touchstart events on the element. */ + private onTouchStart_(event: TouchEvent) { this.lastTouchTouchesCount_ = event.touches.length; if (!this.wasTwoFingerTouch()) { return; @@ -132,17 +103,13 @@ this.notify_('pinchstart', {center: center(event)}); } - /** - * The callback for touch move, end, and cancel events on the element. - * @param {!TouchEvent} event Touch event on the element. - * @private - */ - onTouch_(event) { + /** The callback for touch move, end, and cancel events on the element. */ + private onTouch_(event: TouchEvent) { if (!this.pinchStartEvent_) { return; } - const lastEvent = /** @type {!TouchEvent} */ (this.lastEvent_); + const lastEvent = this.lastEvent_!; // Check if the pinch ends with the current event. if (event.touches.length < 2 || @@ -150,10 +117,9 @@ const startScaleRatio = pinchScaleRatio(lastEvent, this.pinchStartEvent_); this.pinchStartEvent_ = null; this.lastEvent_ = null; - this.notify_('pinchend', { - startScaleRatio: startScaleRatio, - center: center(lastEvent), - }); + this.notify_( + 'pinchend', + {startScaleRatio: startScaleRatio, center: center(lastEvent)}); return; } @@ -161,20 +127,17 @@ const startScaleRatio = pinchScaleRatio(event, this.pinchStartEvent_); this.notify_('pinchupdate', { scaleRatio: scaleRatio, - direction: scaleRatio > 1.0 ? 'in' : 'out', + // TODO(dhoss): Handle case where `scaleRatio` is null? + direction: scaleRatio! > 1.0 ? 'in' : 'out', startScaleRatio: startScaleRatio, - center: center(event), + center: center(event) }); this.lastEvent_ = event; } - /** - * The callback for wheel events on the element. - * @param {!WheelEvent} event Wheel event on the element. - * @private - */ - onWheel_(event) { + /** The callback for wheel events on the element. */ + private onWheel_(event: WheelEvent) { // We handle ctrl-wheels to invoke our own pinch zoom. On Mac, synthetic // ctrl-wheels are created from trackpad pinches. We handle these ourselves // to prevent the browser's native pinch zoom. We also use our pinch @@ -236,32 +199,28 @@ }, gestureEndDelayMs); } - /** - * @param {!Event} e The context menu event - * @private - */ - handleContextMenuEvent_(e) { + private handleContextMenuEvent_(e: MouseEvent) { // Stop Chrome from popping up the context menu on long press. We need to // make sure the start event did not have 2 touches because we don't want // to block two finger tap opening the context menu. We check for // firesTouchEvents in order to not block the context menu on right click. - const capabilities = - /** @type {{ sourceCapabilities: Object }} */ (e).sourceCapabilities; - if (capabilities.firesTouchEvents && !this.wasTwoFingerTouch()) { + const capabilities = e.sourceCapabilities; + if (capabilities && capabilities.firesTouchEvents && + !this.wasTwoFingerTouch()) { e.preventDefault(); } } } /** - * Computes the change in scale between this touch event - * and a previous one. - * @param {!TouchEvent} event Latest touch event on the element. - * @param {!TouchEvent} prevEvent A previous touch event on the element. - * @return {?number} The ratio of the scale of this event and the - * scale of the previous one. + * Computes the change in scale between this touch event and a previous one. + * @param event Latest touch event on the element. + * @param prevEvent A previous touch event on the element. + * @return The ratio of the scale of this event and the scale of the previous + * one. */ -function pinchScaleRatio(event, prevEvent) { +function pinchScaleRatio(event: TouchEvent, prevEvent: TouchEvent): number| + null { const distance1 = distance(prevEvent); const distance2 = distance(event); return distance1 === 0 ? null : distance2 / distance1; @@ -269,10 +228,10 @@ /** * Computes the distance between fingers. - * @param {!TouchEvent} event Touch event with at least 2 touch points. - * @return {number} Distance between touch[0] and touch[1]. + * @param event Touch event with at least 2 touch points. + * @return Distance between touch[0] and touch[1]. */ -function distance(event) { +function distance(event: TouchEvent): number { const touch1 = event.touches[0]; const touch2 = event.touches[1]; const dx = touch1.clientX - touch2.clientX; @@ -282,10 +241,10 @@ /** * Computes the midpoint between fingers. - * @param {!TouchEvent} event Touch event with at least 2 touch points. - * @return {!Point} Midpoint between touch[0] and touch[1]. + * @param event Touch event with at least 2 touch points. + * @return Midpoint between touch[0] and touch[1]. */ -function center(event) { +function center(event: TouchEvent): Point { const touch1 = event.touches[0]; const touch2 = event.touches[1]; return {
diff --git a/chrome/browser/resources/pdf/metrics.js b/chrome/browser/resources/pdf/metrics.ts similarity index 61% rename from chrome/browser/resources/pdf/metrics.js rename to chrome/browser/resources/pdf/metrics.ts index 3e0d874c..e1c67793 100644 --- a/chrome/browser/resources/pdf/metrics.js +++ b/chrome/browser/resources/pdf/metrics.ts
@@ -8,23 +8,20 @@ /** * Records when the zoom mode is changed to fit a FittingType. - * @param {FittingType} fittingType the new FittingType. + * @param fittingType the new FittingType. */ -export function recordFitTo(fittingType) { +export function recordFitTo(fittingType: FittingType) { if (fittingType === FittingType.FIT_TO_PAGE) { record(UserAction.FIT_TO_PAGE); } else if (fittingType === FittingType.FIT_TO_WIDTH) { record(UserAction.FIT_TO_WIDTH); } - // There is no user action to do a fit-to-height, this only happens with + // There is no user action to do a fit-to-height, this only happens with the // the open param "view=FitV". } -/** - * Records the given action to chrome.metricsPrivate. - * @param {UserAction} action - */ -export function record(action) { +/** Records the given action to chrome.metricsPrivate. */ +export function record(action: UserAction) { if (!chrome.metricsPrivate) { return; } @@ -39,7 +36,7 @@ } chrome.metricsPrivate.recordValue(actionsMetric, action); if (firstMap.has(action)) { - const firstAction = firstMap.get(action); + const firstAction = firstMap.get(action)!; if (!firstActionRecorded.has(firstAction)) { chrome.metricsPrivate.recordValue(actionsMetric, firstAction); firstActionRecorded.add(firstAction); @@ -52,11 +49,8 @@ actionsMetric = null; } -/** @type {?chrome.metricsPrivate.MetricType} */ -let actionsMetric = null; - -/** @type {!Set<!UserAction>} */ -const firstActionRecorded = new Set(); +let actionsMetric: chrome.metricsPrivate.MetricType|null = null; +const firstActionRecorded: Set<UserAction> = new Set(); // Keep in sync with enums.xml. // Do not change the numeric values or reuse them since these numbers are @@ -66,142 +60,143 @@ * The *_FIRST values are recorded automaticlly, * eg. record(...ROTATE) will also record ROTATE_FIRST * on the first instance. - * @enum {number} */ -export const UserAction = { +export enum UserAction { // Recorded when the document is first loaded. This event serves as // denominator to determine percentages of documents in which an action was // taken as well as average number of each action per document. - DOCUMENT_OPENED: 0, + DOCUMENT_OPENED = 0, // Recorded when the document is rotated clockwise or counter-clockwise. - ROTATE_FIRST: 1, - ROTATE: 2, + ROTATE_FIRST = 1, + ROTATE = 2, - FIT_TO_WIDTH_FIRST: 3, - FIT_TO_WIDTH: 4, + FIT_TO_WIDTH_FIRST = 3, + FIT_TO_WIDTH = 4, - FIT_TO_PAGE_FIRST: 5, - FIT_TO_PAGE: 6, + FIT_TO_PAGE_FIRST = 5, + FIT_TO_PAGE = 6, // Recorded when a bookmark is followed. - FOLLOW_BOOKMARK_FIRST: 9, - FOLLOW_BOOKMARK: 10, + FOLLOW_BOOKMARK_FIRST = 9, + FOLLOW_BOOKMARK = 10, // Recorded when the page selection is used to navigate to another page. - PAGE_SELECTOR_NAVIGATE_FIRST: 11, - PAGE_SELECTOR_NAVIGATE: 12, + PAGE_SELECTOR_NAVIGATE_FIRST = 11, + PAGE_SELECTOR_NAVIGATE = 12, // Recorded when the user triggers a save of the document. - SAVE_FIRST: 13, - SAVE: 14, + SAVE_FIRST = 13, + SAVE = 14, // Recorded when the user triggers a save of the document and the document // has been modified by annotations. - SAVE_WITH_ANNOTATION_FIRST: 15, - SAVE_WITH_ANNOTATION: 16, + SAVE_WITH_ANNOTATION_FIRST = 15, + SAVE_WITH_ANNOTATION = 16, - PRINT_FIRST: 17, - PRINT: 18, + PRINT_FIRST = 17, + PRINT = 18, - ENTER_ANNOTATION_MODE_FIRST: 19, - ENTER_ANNOTATION_MODE: 20, + ENTER_ANNOTATION_MODE_FIRST = 19, + ENTER_ANNOTATION_MODE = 20, - EXIT_ANNOTATION_MODE_FIRST: 21, - EXIT_ANNOTATION_MODE: 22, + EXIT_ANNOTATION_MODE_FIRST = 21, + EXIT_ANNOTATION_MODE = 22, // Recorded when a pen stroke is made. - ANNOTATE_STROKE_TOOL_PEN_FIRST: 23, - ANNOTATE_STROKE_TOOL_PEN: 24, + ANNOTATE_STROKE_TOOL_PEN_FIRST = 23, + ANNOTATE_STROKE_TOOL_PEN = 24, // Recorded when an eraser stroke is made. - ANNOTATE_STROKE_TOOL_ERASER_FIRST: 25, - ANNOTATE_STROKE_TOOL_ERASER: 26, + ANNOTATE_STROKE_TOOL_ERASER_FIRST = 25, + ANNOTATE_STROKE_TOOL_ERASER = 26, // Recorded when a highlighter stroke is made. - ANNOTATE_STROKE_TOOL_HIGHLIGHTER_FIRST: 27, - ANNOTATE_STROKE_TOOL_HIGHLIGHTER: 28, + ANNOTATE_STROKE_TOOL_HIGHLIGHTER_FIRST = 27, + ANNOTATE_STROKE_TOOL_HIGHLIGHTER = 28, // Recorded when a stroke is made using touch. - ANNOTATE_STROKE_DEVICE_TOUCH_FIRST: 29, - ANNOTATE_STROKE_DEVICE_TOUCH: 30, + ANNOTATE_STROKE_DEVICE_TOUCH_FIRST = 29, + ANNOTATE_STROKE_DEVICE_TOUCH = 30, // Recorded when a stroke is made using mouse. - ANNOTATE_STROKE_DEVICE_MOUSE_FIRST: 31, - ANNOTATE_STROKE_DEVICE_MOUSE: 32, + ANNOTATE_STROKE_DEVICE_MOUSE_FIRST = 31, + ANNOTATE_STROKE_DEVICE_MOUSE = 32, // Recorded when a stroke is made using pen. - ANNOTATE_STROKE_DEVICE_PEN_FIRST: 33, - ANNOTATE_STROKE_DEVICE_PEN: 34, + ANNOTATE_STROKE_DEVICE_PEN_FIRST = 33, + ANNOTATE_STROKE_DEVICE_PEN = 34, // Recorded when two-up view mode is enabled. - TWO_UP_VIEW_ENABLE_FIRST: 35, - TWO_UP_VIEW_ENABLE: 36, + TWO_UP_VIEW_ENABLE_FIRST = 35, + TWO_UP_VIEW_ENABLE = 36, // Recorded when two-up view mode is disabled. - TWO_UP_VIEW_DISABLE_FIRST: 37, - TWO_UP_VIEW_DISABLE: 38, + TWO_UP_VIEW_DISABLE_FIRST = 37, + TWO_UP_VIEW_DISABLE = 38, // Recorded when zoom in button is clicked. - ZOOM_IN_FIRST: 39, - ZOOM_IN: 40, + ZOOM_IN_FIRST = 39, + ZOOM_IN = 40, // Recorded when zoom out button is clicked. - ZOOM_OUT_FIRST: 41, - ZOOM_OUT: 42, + ZOOM_OUT_FIRST = 41, + ZOOM_OUT = 42, // Recorded when the custom zoom input field is modified. - ZOOM_CUSTOM_FIRST: 43, - ZOOM_CUSTOM: 44, + ZOOM_CUSTOM_FIRST = 43, + ZOOM_CUSTOM = 44, // Recorded when a thumbnail is used for navigation. - THUMBNAIL_NAVIGATE_FIRST: 45, - THUMBNAIL_NAVIGATE: 46, + THUMBNAIL_NAVIGATE_FIRST = 45, + THUMBNAIL_NAVIGATE = 46, // Recorded when the user triggers a save of the document and the document // has never been modified. - SAVE_ORIGINAL_ONLY_FIRST: 47, - SAVE_ORIGINAL_ONLY: 48, + SAVE_ORIGINAL_ONLY_FIRST = 47, + SAVE_ORIGINAL_ONLY = 48, // Recorded when the user triggers a save of the original document, even // though the document has been modified. - SAVE_ORIGINAL_FIRST: 49, - SAVE_ORIGINAL: 50, + SAVE_ORIGINAL_FIRST = 49, + SAVE_ORIGINAL = 50, // Recorded when the user triggers a save of the edited document. - SAVE_EDITED_FIRST: 51, - SAVE_EDITED: 52, + SAVE_EDITED_FIRST = 51, + SAVE_EDITED = 52, // Recorded when the sidenav menu button is clicked. - TOGGLE_SIDENAV_FIRST: 53, - TOGGLE_SIDENAV: 54, + TOGGLE_SIDENAV_FIRST = 53, + TOGGLE_SIDENAV = 54, // Recorded when the thumbnails button in the sidenav is clicked. - SELECT_SIDENAV_THUMBNAILS_FIRST: 55, - SELECT_SIDENAV_THUMBNAILS: 56, + SELECT_SIDENAV_THUMBNAILS_FIRST = 55, + SELECT_SIDENAV_THUMBNAILS = 56, // Recorded when the outline button in the sidenav is clicked. - SELECT_SIDENAV_OUTLINE_FIRST: 57, - SELECT_SIDENAV_OUTLINE: 58, + SELECT_SIDENAV_OUTLINE_FIRST = 57, + SELECT_SIDENAV_OUTLINE = 58, // Recorded when the show/hide annotations overflow menu item is clicked. - TOGGLE_DISPLAY_ANNOTATIONS_FIRST: 59, - TOGGLE_DISPLAY_ANNOTATIONS: 60, + TOGGLE_DISPLAY_ANNOTATIONS_FIRST = 59, + TOGGLE_DISPLAY_ANNOTATIONS = 60, // Recorded when the present menu item is clicked. - PRESENT_FIRST: 61, - PRESENT: 62, + PRESENT_FIRST = 61, + PRESENT = 62, // Recorded when the document properties menu item is clicked. - PROPERTIES_FIRST: 63, - PROPERTIES: 64, + PROPERTIES_FIRST = 63, + PROPERTIES = 64, - NUMBER_OF_ACTIONS: 65, -}; + NUMBER_OF_ACTIONS = 65, +} -/** @return {!Map<!UserAction, !UserAction>} */ -function createFirstMap() { - const entries = Object.entries(UserAction).sort((a, b) => a[1] - b[1]); +function createFirstMap(): Map<UserAction, UserAction> { + const entries = (Object.entries(UserAction) as Array<[string, number]>) + .filter(x => Number.isInteger(x[1])) + .sort((a, b) => a[1] - b[1]); + // Exclude the first and last entries (DOCUMENT_OPENED, and NUMBER_OF_ACTIONS) // which don't have an equivalent "_FIRST" UserAction. const entriesWithFirst = entries.slice(1, entries.length - 1); @@ -214,5 +209,4 @@ // Map from UserAction to the 'FIRST' action. These metrics are recorded // by PDFMetrics.log the first time each corresponding action occurs. -/** @type {!Map<!UserAction, !UserAction>} */ -const firstMap = createFirstMap(); +const firstMap: Map<UserAction, UserAction> = createFirstMap();
diff --git a/chrome/browser/resources/pdf/pdf.gni b/chrome/browser/resources/pdf/pdf.gni index b91f274c..9bb0512 100644 --- a/chrome/browser/resources/pdf/pdf.gni +++ b/chrome/browser/resources/pdf/pdf.gni
@@ -7,7 +7,7 @@ # Files to pass directly to preprocess_if_expr() that are used only in PDF # Viewer. pdf_non_webcomponents_files = [ - "bookmark_type.js", + "bookmark_type.ts", "local_storage_proxy.js", "navigator.js", "pdf_viewer_wrapper.js", @@ -66,12 +66,12 @@ # and Print Preview. shared_non_webcomponents_files = [ "browser_api.js", - "constants.js", + "constants.ts", "controller.js", - "gesture_detector.js", + "gesture_detector.ts", "internal_plugin.js", "main.js", - "metrics.js", + "metrics.ts", "open_pdf_params_parser.js", "pdf_scripting_api.js", "pdf_viewer_base.js", @@ -87,7 +87,7 @@ "elements/icons.js", "elements/shared-vars.js", "elements/viewer-error-dialog.js", - "pdf_viewer_shared_style.js", + "pdf_viewer_shared_style.ts", ] # Print Preview's GRDP needs all the shared + Print Preview specific files.
diff --git a/chrome/browser/resources/pdf/pdf_viewer_shared_style.js b/chrome/browser/resources/pdf/pdf_viewer_shared_style.ts similarity index 100% rename from chrome/browser/resources/pdf/pdf_viewer_shared_style.js rename to chrome/browser/resources/pdf/pdf_viewer_shared_style.ts
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index aa297d7..73bbe87f 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -49,8 +49,8 @@ "//ui/webui/resources/cr_components/app_management:build_ts", ] excludes = [ - "chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js", - "chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js", + "chrome://resources/mojo/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js", + "chrome://resources/mojo/ash/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js", "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js", "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js", "chrome://resources/mojo/chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-lite.js",
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js index 61476ca..ad04f87 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -298,9 +298,7 @@ /** @override */ attached() { - this.networkConfig_.getGlobalPolicy().then(response => { - this.globalPolicy_ = response.result; - }); + this.onPoliciesApplied(/*userhash=*/ ''); this.onVpnProvidersChanged(); this.onNetworkStateListChanged(); }, @@ -421,26 +419,6 @@ this.updateIsConnectedToNonCellularNetwork_(); }, - /** NetworkListenerBehavior override */ - onNetworkStateChanged(network) { - if (!network) { - return; - } - // Only WiFi or Cellular network state can be changed by global policy - // update. - const mojom = chromeos.networkConfig.mojom; - if (network.type !== mojom.NetworkType.kWiFi && - network.type !== mojom.NetworkType.kCellular) { - return; - } - - // TODO(b/218871322): we should refresh the global policy once the - // OnPolicyChanged() is added to CrosNetworkConfigObserver - this.networkConfig_.getGlobalPolicy().then(response => { - this.globalPolicy_ = response.result; - }); - }, - onVpnProvidersChanged() { this.networkConfig_.getVpnProviders().then(response => { const providers = response.providers; @@ -449,6 +427,13 @@ }); }, + /** @param {string} userhash */ + onPoliciesApplied(userhash) { + this.networkConfig_.getGlobalPolicy().then(response => { + this.globalPolicy_ = response.result; + }); + }, + /** * @return {!Promise<boolean>} * @private
diff --git a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc index 880337c..a3e8095b 100644 --- a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc +++ b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
@@ -1187,6 +1187,52 @@ EXPECT_FALSE(frame_c_popup_opened); } +// Test that opening a window with `noopener` consumes user activation. +// crbug.com/1264543, crbug.com/1291210 +IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, + UserActivationConsumptionNoopener) { + // Start on a page a.com. + GURL main_url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a")); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), main_url)); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + // Activate the frame by executing a dummy script. + const std::string no_op_script = "// No-op script"; + EXPECT_TRUE(ExecuteScript(web_contents, no_op_script)); + + // Add a popup observer. + content::TestNavigationObserver popup_observer(nullptr); + popup_observer.StartWatchingNewWebContents(); + + // Open a popup from the frame, with `noopener`. This should consume + // transient user activation. + GURL popup_url(embedded_test_server()->GetURL("popup.com", "/")); + EXPECT_TRUE(ExecuteScriptWithoutUserGesture( + web_contents, + base::StringPrintf( + "window.w = window.open('%s'+'title1.html', '_blank', 'noopener');", + popup_url.spec().c_str()))); + + // Try to open another popup. + EXPECT_TRUE(ExecuteScriptWithoutUserGesture( + web_contents, + base::StringPrintf( + "window.w = window.open('%s'+'title2.html', '_blank', 'noopener');", + popup_url.spec().c_str()))); + + // Wait and check that only one popup was opened. + popup_observer.Wait(); + EXPECT_EQ(2, browser()->tab_strip_model()->count()); + + content::WebContents* popup = + browser()->tab_strip_model()->GetActiveWebContents(); + EXPECT_EQ(embedded_test_server()->GetURL("popup.com", "/title1.html"), + popup->GetLastCommittedURL()); + EXPECT_NE(popup, web_contents); +} + // TODO(crbug.com/1021895): Flaky. // Tests that a cross-site iframe runs its beforeunload handler when closing a // tab. See https://crbug.com/853021.
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc index e474042d..25dc360 100644 --- a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc +++ b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc
@@ -820,5 +820,56 @@ helper_.CheckAppInListNotLocallyInstalled("SiteA"); } +IN_PROC_BROWSER_TEST_F( + TwoClientWebAppsIntegrationTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_40Client2_45SiteA_46SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.SwitchProfileClients("Client2"); + helper_.CheckAppInListNotLocallyInstalled("SiteA"); + helper_.InstallLocally("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + TwoClientWebAppsIntegrationTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_40Client2_45SiteA_46SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.SwitchProfileClients("Client2"); + helper_.CheckAppInListNotLocallyInstalled("SiteA"); + helper_.InstallLocally("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + TwoClientWebAppsIntegrationTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_40Client2_45SiteA_46SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.SwitchProfileClients("Client2"); + helper_.CheckAppInListNotLocallyInstalled("SiteA"); + helper_.InstallLocally("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + } // namespace } // namespace web_app
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java index 62f3a13..0d5171d1b 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java
@@ -225,13 +225,6 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { - for (TabModelObserver observer : mFilteredObservers) { - observer.didCloseTab(tabId, incognito); - } - } - - @Override public void willAddTab(Tab tab, int type) { for (TabModelObserver observer : mFilteredObservers) { observer.willAddTab(tab, type);
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java index 6209a9f..0e4637fc 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java
@@ -34,20 +34,9 @@ default void willCloseTab(Tab tab, boolean animate) {} /** - * Called right after {@code tab} has been destroyed. + * Called right before {@code tab} will be destroyed. * - * @param tabId The ID of the tab that was destroyed. - * @param incognito True if the closed tab was incognito. - * - * @deprecated Use {@link #didCloseTab(Tab)} instead - */ - @Deprecated - default void didCloseTab(int tabId, boolean incognito) {} - - /** - * Called right after {@code tab} has been destroyed. - * - * @param tab The tab that was closed. + * @param tab The {@link Tab} that was closed. */ default void didCloseTab(Tab tab) {}
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java index 4a85e3b..0f086fe3 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java
@@ -62,10 +62,9 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { - Tab tab = mTabsToClose.get(tabId); - if (tab != null) { - mTabsToClose.remove(tabId); + public void didCloseTab(Tab tab) { + if (mTabsToClose.get(tab.getId()) != null) { + mTabsToClose.remove(tab.getId()); onTabUnregistered(tab); } }
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc index 80936389..98cc3ff 100644 --- a/chrome/browser/themes/browser_theme_pack.cc +++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -98,7 +98,7 @@ // changed default theme assets, if you need themes to recreate their generated // images (which are cached), if you changed how missing values are // generated, or if you changed any constants. -const int kThemePackVersion = 88; +const int kThemePackVersion = 91; // IDs that are in the DataPack won't clash with the positive integer // uint16_t. kHeaderID should always have the maximum value because we want the @@ -1077,6 +1077,13 @@ {TP::COLOR_DOWNLOAD_SHELF, kColorDownloadShelf}, {TP::COLOR_FRAME_ACTIVE, ui::kColorFrameActive}, {TP::COLOR_FRAME_INACTIVE, ui::kColorFrameInactive}, + {TP::COLOR_NTP_BACKGROUND, kColorNewTabPageBackground}, + {TP::COLOR_NTP_HEADER, kColorNewTabPageHeader}, + {TP::COLOR_NTP_LINK, kColorNewTabPageLink}, + {TP::COLOR_NTP_LOGO, kColorNewTabPageLogo}, + {TP::COLOR_NTP_SECTION_BORDER, kColorNewTabPageSectionBorder}, + {TP::COLOR_NTP_SHORTCUT, kColorNewTabPageMostVisitedTileBackground}, + {TP::COLOR_NTP_TEXT, kColorNewTabPageText}, {TP::COLOR_INFOBAR, kColorInfoBarBackground}, {TP::COLOR_INFOBAR_TEXT, kColorInfoBarForeground}, {TP::COLOR_OMNIBOX_TEXT, kColorOmniboxText}, @@ -1600,9 +1607,9 @@ } SkColor omnibox_background_color; if (GetColor(TP::COLOR_OMNIBOX_BACKGROUND, &omnibox_background_color)) { - SetColor(TP::COLOR_OMNIBOX_BACKGROUND, - color_utils::GetResultingPaintColor(omnibox_background_color, - toolbar_color)); + omnibox_background_color = color_utils::GetResultingPaintColor( + omnibox_background_color, toolbar_color); + SetColor(TP::COLOR_OMNIBOX_BACKGROUND, omnibox_background_color); } else { omnibox_background_color = TP::GetDefaultColor(TP::COLOR_OMNIBOX_BACKGROUND, false); @@ -1883,9 +1890,15 @@ gfx::Image image = GetImageNamed(IDR_THEME_NTP_BACKGROUND); bool has_background_image = !image.IsEmpty(); + // Opaquify background color. SkColor background_color; bool has_background_color = GetColor(TP::COLOR_NTP_BACKGROUND, &background_color); + if (has_background_color) { + background_color = color_utils::GetResultingPaintColor( + background_color, TP::GetDefaultColor(TP::COLOR_NTP_BACKGROUND, false)); + SetColor(TP::COLOR_NTP_BACKGROUND, background_color); + } // Calculate NTP text color based on NTP background. SkColor text_color; @@ -1928,6 +1941,11 @@ background_color, /*luminosity_change=*/0.2f)); } + + // Calculate NTP section border color. + SkColor header_color; + if (GetColor(TP::COLOR_NTP_HEADER, &header_color)) + SetColor(TP::COLOR_NTP_SECTION_BORDER, SkColorSetA(header_color, 0x50)); } void BrowserThemePack::RepackImages(const ImageCache& images,
diff --git a/chrome/browser/themes/increased_contrast_theme_supplier.cc b/chrome/browser/themes/increased_contrast_theme_supplier.cc index 94d526e..4d1bb67 100644 --- a/chrome/browser/themes/increased_contrast_theme_supplier.cc +++ b/chrome/browser/themes/increased_contrast_theme_supplier.cc
@@ -45,7 +45,8 @@ case ThemeProperties::COLOR_FRAME_ACTIVE_INCOGNITO: *color = SK_ColorDKGRAY; return true; - case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR: + case ThemeProperties::COLOR_TAB_STROKE_FRAME_ACTIVE: + case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE: *color = is_dark_mode_ ? SK_ColorDKGRAY : SK_ColorLTGRAY; return true; case ThemeProperties::COLOR_LOCATION_BAR_BORDER:
diff --git a/chrome/browser/themes/theme_helper.cc b/chrome/browser/themes/theme_helper.cc index f128d79..76a3a8b 100644 --- a/chrome/browser/themes/theme_helper.cc +++ b/chrome/browser/themes/theme_helper.cc
@@ -403,6 +403,12 @@ case TP::COLOR_TAB_FOREGROUND_ACTIVE_FRAME_ACTIVE: case TP::COLOR_TAB_FOREGROUND_ACTIVE_FRAME_INACTIVE: return GetColor(TP::COLOR_TOOLBAR_TEXT, incognito, theme_supplier); + case TP::COLOR_TAB_STROKE_FRAME_ACTIVE: + return GetColor(TP::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE, incognito, + theme_supplier); + case TP::COLOR_TAB_STROKE_FRAME_INACTIVE: + return GetColor(TP::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE, incognito, + theme_supplier); case TP::COLOR_DOWNLOAD_SHELF_BUTTON_BACKGROUND: return GetColor(TP::COLOR_DOWNLOAD_SHELF, incognito, theme_supplier); case TP::COLOR_DOWNLOAD_SHELF_BUTTON_TEXT: { @@ -460,12 +466,12 @@ gfx::kGoogleGreyAlpha500); case TP::COLOR_LOCATION_BAR_BORDER: return SkColorSetA(SK_ColorBLACK, 0x4D); - case TP::COLOR_TOOLBAR_TOP_SEPARATOR: - case TP::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE: { + case TP::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE: + case TP::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE: { const SkColor tab_color = GetColor(TP::COLOR_TOOLBAR, incognito, theme_supplier); - const SkColor frame_color = - get_frame_color(/*active=*/id == TP::COLOR_TOOLBAR_TOP_SEPARATOR); + const SkColor frame_color = get_frame_color( + /*active=*/id == TP::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE); const SeparatorColorKey key(tab_color, frame_color); auto i = GetSeparatorColorCache().find(key); if (i != GetSeparatorColorCache().end()) @@ -503,6 +509,9 @@ return SkColorSetA( GetColor(TP::COLOR_TOOLBAR_BUTTON_ICON, incognito, theme_supplier), 0x3A); + case TP::COLOR_NTP_SECTION_BORDER: + return SkColorSetA( + GetColor(TP::COLOR_NTP_HEADER, incognito, theme_supplier), 0x50); case TP::COLOR_NTP_TEXT_LIGHT: return IncreaseLightness( GetColor(TP::COLOR_NTP_TEXT, incognito, theme_supplier), 0.40); @@ -543,39 +552,48 @@ // static SkColor ThemeHelper::GetSeparatorColor(SkColor tab_color, SkColor frame_color) { - const float kContrastRatio = 2.f; + constexpr float kContrastRatio = 2.0f; - // In most cases, if the tab is lighter than the frame, we darken the - // frame; if the tab is darker than the frame, we lighten the frame. - // However, if the frame is already very dark or very light, respectively, - // this won't contrast sufficiently with the frame color, so we'll need to - // reverse when we're lightening and darkening. - SkColor separator_color = SK_ColorWHITE; - if (color_utils::GetRelativeLuminance(tab_color) >= - color_utils::GetRelativeLuminance(frame_color)) { - separator_color = color_utils::GetColorWithMaxContrast(separator_color); - } - - { - const auto result = color_utils::BlendForMinContrast( - frame_color, frame_color, separator_color, kContrastRatio); - if (color_utils::GetContrastRatio(result.color, frame_color) >= - kContrastRatio) { - return SkColorSetA(separator_color, result.alpha); + // Used to generate the initial alpha blended separator color. + const auto generate_separator_color = [&]() { + // In most cases, if the tab is lighter than the frame, we darken the frame; + // if the tab is darker than the frame, we lighten the frame. + // However, if the frame is already very dark or very light, respectively, + // this won't contrast sufficiently with the frame color, so we'll need to + // reverse when we're lightening and darkening. + SkColor separator_color = SK_ColorWHITE; + if (color_utils::GetRelativeLuminance(tab_color) >= + color_utils::GetRelativeLuminance(frame_color)) { + separator_color = color_utils::GetColorWithMaxContrast(separator_color); } - } - separator_color = color_utils::GetColorWithMaxContrast(separator_color); + { + const auto result = color_utils::BlendForMinContrast( + frame_color, frame_color, separator_color, kContrastRatio); + if (color_utils::GetContrastRatio(result.color, frame_color) >= + kContrastRatio) { + return SkColorSetA(separator_color, result.alpha); + } + } - // If the above call failed to create sufficient contrast, the frame color is - // already very dark or very light. Since separators are only used when the - // tab has low contrast against the frame, the tab color is similarly very - // dark or very light, just not quite as much so as the frame color. Blend - // towards the opposite separator color, and compute the contrast against the - // tab instead of the frame to ensure both contrasts hit the desired minimum. - const auto result = color_utils::BlendForMinContrast( - frame_color, tab_color, separator_color, kContrastRatio); - return SkColorSetA(separator_color, result.alpha); + separator_color = color_utils::GetColorWithMaxContrast(separator_color); + + // If the above call failed to create sufficient contrast, the frame color + // is already very dark or very light. Since separators are only used when + // the tab has low contrast against the frame, the tab color is similarly + // very dark or very light, just not quite as much so as the frame color. + // Blend towards the opposite separator color, and compute the contrast + // against the tab instead of the frame to ensure both contrasts hit the + // desired minimum. + const auto result = color_utils::BlendForMinContrast( + frame_color, tab_color, separator_color, kContrastRatio); + return SkColorSetA(separator_color, result.alpha); + }; + + // The vertical tab separator might show through the stroke if the stroke + // color is translucent. To prevent this, always use an opaque stroke color. + return color_utils::GetResultingPaintColor(generate_separator_color(), + frame_color); } // static
diff --git a/chrome/browser/themes/theme_helper_win.cc b/chrome/browser/themes/theme_helper_win.cc index cf5c5a9..b8ef93a 100644 --- a/chrome/browser/themes/theme_helper_win.cc +++ b/chrome/browser/themes/theme_helper_win.cc
@@ -49,9 +49,11 @@ // Window Text case ThemeProperties::COLOR_BOOKMARK_SEPARATOR: + case ThemeProperties::COLOR_TAB_STROKE_FRAME_ACTIVE: + case ThemeProperties::COLOR_TAB_STROKE_FRAME_INACTIVE: case ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR: - case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR: - case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE: + case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE: + case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE: case ThemeProperties::COLOR_LOCATION_BAR_BORDER: system_theme_color = ui::NativeTheme::SystemThemeColor::kWindowText; break;
diff --git a/chrome/browser/themes/theme_properties.cc b/chrome/browser/themes/theme_properties.cc index 87fff177..ac5f2de 100644 --- a/chrome/browser/themes/theme_properties.cc +++ b/chrome/browser/themes/theme_properties.cc
@@ -94,8 +94,10 @@ return gfx::kGoogleGrey100; // Properties not stored in theme pack. - case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR: - case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE: + case ThemeProperties::COLOR_TAB_STROKE_FRAME_ACTIVE: + case ThemeProperties::COLOR_TAB_STROKE_FRAME_INACTIVE: + case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE: + case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE: return SkColorSetA(SK_ColorBLACK, 0x40); case ThemeProperties::COLOR_FEATURE_PROMO_BUBBLE_TEXT: return SK_ColorWHITE;
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h index d8ebb22..6115464 100644 --- a/chrome/browser/themes/theme_properties.h +++ b/chrome/browser/themes/theme_properties.h
@@ -127,10 +127,9 @@ // The color of the line separating the top of the toolbar from the region // above. For a tabbed browser window, this is the line along the bottom - // edge of the tabstrip, the stroke around the tabs, and the new tab button - // stroke/shadow color. - COLOR_TOOLBAR_TOP_SEPARATOR, - COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE, + // edge of the tabstrip. + COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE, + COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE, // /!\ If you make any changes to this enum, you must also increment // kThemePackVersion in browser_theme_pack.cc, or else themes will display @@ -171,6 +170,10 @@ COLOR_TAB_FOREGROUND_ACTIVE_FRAME_ACTIVE_INCOGNITO, COLOR_TAB_FOREGROUND_ACTIVE_FRAME_INACTIVE_INCOGNITO, + // Colors used for the stroke around tabs. + COLOR_TAB_STROKE_FRAME_ACTIVE, + COLOR_TAB_STROKE_FRAME_INACTIVE, + // The throbber colors for tabs or anything on a toolbar (currently, only // the download shelf). Do not use directly; only for use inside // browser_theme_pack.cc. @@ -253,10 +256,11 @@ COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_INCOGNITO_ACTIVE, COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_INCOGNITO_INACTIVE, - COLOR_NTP_TEXT_LIGHT, COLOR_NTP_LOGO, + COLOR_NTP_SECTION_BORDER, // Color for the background of the most visited/custom link tile. COLOR_NTP_SHORTCUT, + COLOR_NTP_TEXT_LIGHT, #if BUILDFLAG(IS_WIN) // The colors of the 1px border around the window on Windows 10.
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc index da797d2..558e4400 100644 --- a/chrome/browser/themes/theme_service.cc +++ b/chrome/browser/themes/theme_service.cc
@@ -123,7 +123,12 @@ {TP::COLOR_LOCATION_BAR_BORDER, kColorLocationBarBorder}, {TP::COLOR_NTP_BACKGROUND, kColorNewTabPageBackground}, {TP::COLOR_NTP_HEADER, kColorNewTabPageHeader}, + {TP::COLOR_NTP_LINK, kColorNewTabPageLink}, + {TP::COLOR_NTP_LOGO, kColorNewTabPageLogo}, + {TP::COLOR_NTP_SECTION_BORDER, kColorNewTabPageSectionBorder}, + {TP::COLOR_NTP_SHORTCUT, kColorNewTabPageMostVisitedTileBackground}, {TP::COLOR_NTP_TEXT, kColorNewTabPageText}, + {TP::COLOR_NTP_TEXT_LIGHT, kColorNewTabPageTextLight}, {TP::COLOR_OMNIBOX_BACKGROUND, kColorOmniboxBackground}, {TP::COLOR_OMNIBOX_BACKGROUND_HOVERED, kColorOmniboxBackgroundHovered}, {TP::COLOR_OMNIBOX_BUBBLE_OUTLINE, kColorOmniboxBubbleOutline}, @@ -262,6 +267,10 @@ {TP::COLOR_TOOLBAR_INK_DROP, kColorToolbarInkDrop}, {TP::COLOR_TOOLBAR_TEXT, kColorToolbarText}, {TP::COLOR_TOOLBAR_VERTICAL_SEPARATOR, kColorToolbarSeparator}, + {TP::COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_ACTIVE, + kColorWindowControlButtonBackgroundActive}, + {TP::COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_INACTIVE, + kColorWindowControlButtonBackgroundInactive}, }); // clang-format on auto* color_it = kMap.find(color_id);
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc index 48a32cd..60c46e3 100644 --- a/chrome/browser/themes/theme_service_unittest.cc +++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -810,7 +810,8 @@ TEST_P(ThemeProviderRedirectedEquivalenceTest, MAYBE_GetColor) { static constexpr const auto kTolerances = base::MakeFixedFlatMap<int, int>( {{ThemeProperties::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_INACTIVE, 1}, - {ThemeProperties::COLOR_TAB_GROUP_BOOKMARK_BAR_ORANGE, 1}}); + {ThemeProperties::COLOR_TAB_GROUP_BOOKMARK_BAR_ORANGE, 1}, + {ThemeProperties::COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_INACTIVE, 1}}); auto get_tolerance = [](int id) { auto* it = kTolerances.find(id); if (it != kTolerances.end())
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.cc b/chrome/browser/tracing/chrome_tracing_delegate.cc index 673ba93..01b8d48a 100644 --- a/chrome/browser/tracing/chrome_tracing_delegate.cc +++ b/chrome/browser/tracing/chrome_tracing_delegate.cc
@@ -51,7 +51,7 @@ #endif #if BUILDFLAG(IS_CHROMEOS_LACROS) -#include "chrome/browser/lacros/crosapi_pref_observer.h" +#include "chromeos/lacros/crosapi_pref_observer.h" #endif namespace {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 4b0f66e..df8dd0a 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -210,8 +210,6 @@ "webid/account_selection_view.h", "webid/identity_dialog_controller.cc", "webid/identity_dialog_controller.h", - "webid/webid_dialog.cc", - "webid/webid_dialog.h", "webui/about_ui.cc", "webui/about_ui.h", "webui/autofill_and_password_manager_internals/autofill_internals_ui.cc", @@ -830,7 +828,6 @@ "android/toolbar/location_bar_model_android.h", "android/webid/account_selection_view_android.cc", "android/webid/account_selection_view_android.h", - "android/webid/webid_dialog_android.cc", "autofill/autofill_bubble_base.h", "autofill/autofill_bubble_controller_base.cc", "autofill/autofill_bubble_controller_base.h", @@ -2963,6 +2960,8 @@ "//ash/quick_pair/keyed_service", "//ash/quick_pair/repository", "//ash/quick_pair/ui", + "//ash/services/cellular_setup", + "//ash/services/cellular_setup/public/mojom", "//ash/services/multidevice_setup", "//ash/services/multidevice_setup/public/cpp", "//ash/services/multidevice_setup/public/cpp:android_sms_app_helper_delegate", @@ -3081,8 +3080,6 @@ "//chromeos/services/bluetooth_config", "//chromeos/services/bluetooth_config:in_process_bluetooth_config", "//chromeos/services/bluetooth_config/public/mojom", - "//chromeos/services/cellular_setup", - "//chromeos/services/cellular_setup/public/mojom", "//chromeos/services/network_config/public/mojom", "//chromeos/services/network_health/public/mojom", "//chromeos/system", @@ -3895,8 +3892,6 @@ sources += [ "startup/web_app_info_recorder_utils.cc", "startup/web_app_info_recorder_utils.h", - "startup/web_app_url_handling_startup_utils.cc", - "startup/web_app_url_handling_startup_utils.h", ] } @@ -4875,12 +4870,6 @@ "views/webauthn/webauthn_icon_view.cc", "views/webauthn/webauthn_icon_view.h", "views/webid/webid_account_selection_views.cc", - "views/webid/webid_dialog_views.cc", - "views/webid/webid_dialog_views.h", - "views/webid/webid_permission_view.cc", - "views/webid/webid_permission_view.h", - "views/webid/webid_signin_page_view.cc", - "views/webid/webid_signin_page_view.h", "webauthn/account_hover_list_model.cc", "webauthn/account_hover_list_model.h", "webauthn/authenticator_request_sheet_model.cc", @@ -5016,15 +5005,6 @@ ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { - sources += [ - "views/web_apps/web_app_url_handler_hover_button.cc", - "views/web_apps/web_app_url_handler_hover_button.h", - "views/web_apps/web_app_url_handler_intent_picker_dialog_view.cc", - "views/web_apps/web_app_url_handler_intent_picker_dialog_view.h", - ] - } - if (use_aura) { # These files can do Gtk+-based theming for builds with gtk enabled. if (is_linux || is_chromeos_lacros) {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java index ca0e5287..82d8fa1d0 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java
@@ -121,7 +121,7 @@ } @Override - public void didCloseTab(int tabId, boolean incognito) { + public void didCloseTab(Tab tab) { updateTabCount(); }
diff --git a/chrome/browser/ui/android/webid/webid_dialog_android.cc b/chrome/browser/ui/android/webid/webid_dialog_android.cc deleted file mode 100644 index 9f24cad4..0000000 --- a/chrome/browser/ui/android/webid/webid_dialog_android.cc +++ /dev/null
@@ -1,62 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <memory> - -#include "base/bind.h" -#include "base/threading/sequenced_task_runner_handle.h" -#include "chrome/browser/ui/webid/webid_dialog.h" - -namespace content { -class WebContents; -} // namespace content - -// A stub implementation for WebID Dialog for Android. -// -// The dialog simply accepts various permissions and shows no UI. This is here -// to avoid crash when WebID is used on Android. -class WebIdDialogAndroidStub : public WebIdDialog { - public: - explicit WebIdDialogAndroidStub(content::WebContents* rp_web_contents, - CloseCallback callback) - : WebIdDialog(rp_web_contents), close_callback_(std::move(callback)) {} - - WebIdDialogAndroidStub(const WebIdDialogAndroidStub&) = delete; - WebIdDialogAndroidStub operator=(const WebIdDialogAndroidStub&) = delete; - ~WebIdDialogAndroidStub() override {} - - void ShowInitialPermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionDialogMode mode, - PermissionCallback callback) override { - // Post a task to run the callback because FederatedAuthNavigationThrottle - // currently assumes these callbacks are run asynchronously. - base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), UserApproval::kApproved)); - } - void ShowTokenExchangePermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionCallback callback) override { - // Post a task to run the callback because FederatedAuthNavigationThrottle - // currently assumes these callbacks are run asynchronously. - base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), UserApproval::kApproved)); - delete this; - } - void ShowSigninPage(content::WebContents* idp_web_contents, - const GURL& idp_signin_url) override {} - void CloseSigninPage() override { std::move(close_callback_).Run(); } - - private: - CloseCallback close_callback_; -}; - -// static -WebIdDialog* WebIdDialog::Create(content::WebContents* rp_web_contents, - CloseCallback callback) { - // This instance gets deleted once token exchange permission is called. - return new WebIdDialogAndroidStub(rp_web_contents, std::move(callback)); -}
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index b35a1bb6..a257e069 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -163,6 +163,7 @@ #include "components/captive_portal/core/buildflags.h" #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/custom_handlers/protocol_handler_registry.h" #include "components/custom_handlers/register_protocol_handler_permission_request.h" #include "components/favicon/content/content_favicon_driver.h" @@ -207,7 +208,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/content_constants.h" #include "content/public/common/content_features.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "content/public/common/page_zoom.h" #include "content/public/common/profiling.h" #include "content/public/common/url_constants.h" @@ -289,11 +289,11 @@ using content::NavigationController; using content::NavigationEntry; using content::OpenURLParams; -using content::ProtocolHandler; using content::Referrer; using content::RenderWidgetHostView; using content::SiteInstance; using content::WebContents; +using custom_handlers::ProtocolHandler; using extensions::Extension; using ui::WebDialogDelegate; using web_modal::WebContentsModalDialogManager;
diff --git a/chrome/browser/ui/browser_dialogs.h b/chrome/browser/ui/browser_dialogs.h index b2cd8650..f711548 100644 --- a/chrome/browser/ui/browser_dialogs.h +++ b/chrome/browser/ui/browser_dialogs.h
@@ -80,13 +80,6 @@ struct SelectedFileInfo; } // namespace ui -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -namespace web_app { -struct UrlHandlerLaunchParams; -} -#endif - namespace chrome { // Shows or hides the Task Manager. |browser| can be NULL when called from Ash. @@ -207,27 +200,6 @@ WebAppLaunchAcceptanceCallback close_callback); #endif // !BUILDFLAG(IS_ANDROID) -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -// Callback that runs when the Web App URL Handler Intent Picker dialog is -// closed. `accepted` is true when the dialog is accepted, false otherwise. -// `launch_params` contains information of the app that is selected to open by -// the user. It is null when the user selects to open the browser. -using WebAppUrlHandlerAcceptanceCallback = base::OnceCallback<void( - bool accepted, - absl::optional<web_app::UrlHandlerLaunchParams> launch_params)>; - -// Shows the Web App URL Handler Intent Picker dialog and runs -// `dialog_close_callback` on closure with the dialog acceptance status and -// information of the user-selected app. `launch_params_list` contains -// information of all the apps to show. `url` is the URL to launch if the -// dialog is accepted by the user. -void ShowWebAppUrlHandlerIntentPickerDialog( - const GURL& url, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - WebAppUrlHandlerAcceptanceCallback dialog_close_callback); -#endif - // Sets whether |ShowWebAppDialog| should accept immediately without any // user interaction. |auto_open_in_window| sets whether the open in window // checkbox is checked.
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h index bb2d688..af4edf29 100644 --- a/chrome/browser/ui/color/chrome_color_id.h +++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -64,7 +64,13 @@ /* New Tab Page colors. */ \ E(kColorNewTabPageBackground, ThemeProperties::COLOR_NTP_BACKGROUND) \ E(kColorNewTabPageHeader, ThemeProperties::COLOR_NTP_HEADER) \ + E(kColorNewTabPageLink, ThemeProperties::COLOR_NTP_LINK) \ + E(kColorNewTabPageLogo, ThemeProperties::COLOR_NTP_LOGO) \ + E(kColorNewTabPageMostVisitedTileBackground, \ + ThemeProperties::COLOR_NTP_SHORTCUT) \ + E(kColorNewTabPageSectionBorder, ThemeProperties::COLOR_NTP_SECTION_BORDER) \ E(kColorNewTabPageText, ThemeProperties::COLOR_NTP_TEXT) \ + E(kColorNewTabPageTextLight, ThemeProperties::COLOR_NTP_TEXT_LIGHT) \ /* Omnibox colors. */ \ E(kColorOmniboxBackground, ThemeProperties::COLOR_OMNIBOX_BACKGROUND) \ E(kColorOmniboxBackgroundHovered, \ @@ -225,7 +231,12 @@ E(kColorToolbarInkDrop, ThemeProperties::COLOR_TOOLBAR_INK_DROP) \ E(kColorToolbarSeparator, \ ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR) \ - E(kColorToolbarText, ThemeProperties::COLOR_TOOLBAR_TEXT) + E(kColorToolbarText, ThemeProperties::COLOR_TOOLBAR_TEXT) \ + /* Window control button background colors */ \ + E(kColorWindowControlButtonBackgroundActive, \ + ThemeProperties::COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_ACTIVE) \ + E(kColorWindowControlButtonBackgroundInactive, \ + ThemeProperties::COLOR_WINDOW_CONTROL_BUTTON_BACKGROUND_INACTIVE) #if BUILDFLAG(IS_WIN) #define CHROME_NATIVE_COLOR_IDS \
diff --git a/chrome/browser/ui/color/chrome_color_mixer.cc b/chrome/browser/ui/color/chrome_color_mixer.cc index 9defc4c9..c5e56ba5 100644 --- a/chrome/browser/ui/color/chrome_color_mixer.cc +++ b/chrome/browser/ui/color/chrome_color_mixer.cc
@@ -73,6 +73,24 @@ std::move(dark_extreme), std::move(light_extreme)); } +ui::ColorTransform IncreaseLightness(ui::ColorTransform input_transform, + double percent) { + const auto generator = [](ui::ColorTransform input_transform, double percent, + SkColor input_color, const ui::ColorMixer& mixer) { + const SkColor color = input_transform.Run(input_color, mixer); + color_utils::HSL result; + color_utils::SkColorToHSL(color, &result); + result.l += (1 - result.l) * percent; + const SkColor result_color = + color_utils::HSLToSkColor(result, SkColorGetA(color)); + DVLOG(2) << "ColorTransform IncreaseLightness:" + << " Input: " << ui::SkColorName(color) + << " Result: " << ui::SkColorName(result_color); + return result_color; + }; + return base::BindRepeating(generator, std::move(input_transform), percent); +} + // This differs from ui::SelectColorBasedOnInput in that we're checking if the // input transform is *not* dark under the assumption that the background color // *is* dark from a potential custom theme. Additionally, if the mode is @@ -197,8 +215,17 @@ mixer[kColorLocationBarBorder] = {SkColorSetA(SK_ColorBLACK, 0x4D)}; mixer[kColorNewTabPageBackground] = {kColorToolbar}; mixer[kColorNewTabPageHeader] = {SkColorSetRGB(0x96, 0x96, 0x96)}; + mixer[kColorNewTabPageLink] = {dark_mode ? gfx::kGoogleBlue300 + : SkColorSetRGB(0x06, 0x37, 0x74)}; + mixer[kColorNewTabPageLogo] = {SkColorSetRGB(0xEE, 0xEE, 0xEE)}; + mixer[kColorNewTabPageMostVisitedTileBackground] = { + dark_mode ? gfx::kGoogleGrey900 : gfx::kGoogleGrey100}; + mixer[kColorNewTabPageSectionBorder] = + ui::SetAlpha(kColorNewTabPageHeader, 0x50); mixer[kColorNewTabPageText] = {dark_mode ? gfx::kGoogleGrey200 : SK_ColorBLACK}; + mixer[kColorNewTabPageTextLight] = + IncreaseLightness(kColorNewTabPageText, 0.40); mixer[kColorOmniboxBackground] = {dark_mode ? gfx::kGoogleGrey900 : gfx::kGoogleGrey100}; mixer[kColorOmniboxText] = @@ -321,4 +348,7 @@ mixer[kColorToolbarInkDrop] = ui::GetColorWithMaxContrast(kColorToolbar); mixer[kColorToolbarSeparator] = ui::SetAlpha(kColorToolbarButtonIcon, 0x4D); mixer[kColorToolbarText] = {dark_mode ? SK_ColorWHITE : gfx::kGoogleGrey800}; + mixer[kColorWindowControlButtonBackgroundActive] = {ui::kColorFrameActive}; + mixer[kColorWindowControlButtonBackgroundInactive] = { + ui::kColorFrameInactive}; }
diff --git a/chrome/browser/ui/color/win/native_chrome_color_mixer_win.cc b/chrome/browser/ui/color/win/native_chrome_color_mixer_win.cc index 7b86886..eadb34d 100644 --- a/chrome/browser/ui/color/win/native_chrome_color_mixer_win.cc +++ b/chrome/browser/ui/color/win/native_chrome_color_mixer_win.cc
@@ -212,6 +212,12 @@ // actually pass in these IDs. FrameColorHelper::Get()->AddBorderAccentColors(mixer); + if (key.color_mode == ui::ColorProviderManager::ColorMode::kLight) { + mixer[kColorNewTabPageBackground] = {ui::kColorNativeWindow}; + mixer[kColorNewTabPageLink] = {ui::kColorNativeHotlight}; + mixer[kColorNewTabPageText] = {ui::kColorNativeWindowText}; + } + if (key.contrast_mode != ui::ColorProviderManager::ContrastMode::kHigh) { FrameColorHelper::Get()->AddNativeChromeColors(mixer, key); return;
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc index 5965c8d7..fed4fb82 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -428,8 +428,10 @@ web_contents, ContentSettingsType::PROTOCOL_HANDLERS), registry_(registry), - pending_handler_(ProtocolHandler::EmptyProtocolHandler()), - previous_handler_(ProtocolHandler::EmptyProtocolHandler()) { + pending_handler_( + custom_handlers::ProtocolHandler::EmptyProtocolHandler()), + previous_handler_( + custom_handlers::ProtocolHandler::EmptyProtocolHandler()) { auto* content_settings = chrome::PageSpecificContentSettingsDelegate::FromWebContents( web_contents);
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.h b/chrome/browser/ui/content_settings/content_setting_bubble_model.h index f6c6c27..47c9d84 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.h +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
@@ -22,7 +22,7 @@ #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" -#include "content/public/common/custom_handlers/protocol_handler.h" +#include "components/custom_handlers/protocol_handler.h" #include "third_party/blink/public/common/mediastream/media_stream_request.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/image/image.h" @@ -43,8 +43,6 @@ class Event; } -using content::ProtocolHandler; - // The hierarchy of bubble models: // // ContentSettingBubbleModel - base class @@ -352,8 +350,8 @@ void PerformActionForSelectedItem(); raw_ptr<custom_handlers::ProtocolHandlerRegistry> registry_; - ProtocolHandler pending_handler_; - ProtocolHandler previous_handler_; + custom_handlers::ProtocolHandler pending_handler_; + custom_handlers::ProtocolHandler previous_handler_; }; // The model of the content settings bubble for media settings.
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc index 4857a7eb..761a679 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
@@ -59,6 +59,7 @@ using content::WebContentsTester; using content_settings::PageSpecificContentSettings; +using custom_handlers::ProtocolHandler; class ContentSettingBubbleModelTest : public ChromeRenderViewHostTestHarness { protected:
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc index d256cb8..61bee756 100644 --- a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc +++ b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
@@ -179,8 +179,9 @@ EXPECT_FALSE(content_setting_image_model->is_visible()); chrome::PageSpecificContentSettingsDelegate::FromWebContents(web_contents()) - ->set_pending_protocol_handler(ProtocolHandler::CreateProtocolHandler( - "mailto", GURL("https://www.google.com/"))); + ->set_pending_protocol_handler( + custom_handlers::ProtocolHandler::CreateProtocolHandler( + "mailto", GURL("https://www.google.com/"))); content_setting_image_model->Update(web_contents()); EXPECT_TRUE(content_setting_image_model->is_visible()); }
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index db42f60d..3069f81 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -126,11 +126,6 @@ #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) #endif // BUILDFLAG(IS_WIN) -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -#include "chrome/browser/ui/startup/web_app_url_handling_startup_utils.h" -#endif - #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) #include "chrome/browser/ui/startup/web_app_info_recorder_utils.h" #endif @@ -519,37 +514,6 @@ return false; } -#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -bool MaybeLaunchUrlHandlerWebAppFromCmd( - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - chrome::startup::IsProcessStartup process_startup, - chrome::startup::IsFirstRun is_first_run, - StartupProfileInfo profile_info, - const std::vector<Profile*>& last_opened_profiles) { - auto on_urls_unhandled_cb = base::BindOnce( - [](const base::CommandLine& command_line, const base::FilePath& cur_dir, - chrome::startup::IsProcessStartup process_startup, - chrome::startup::IsFirstRun is_first_run, - StartupProfileInfo profile_info, - const std::vector<Profile*>& last_opened_profiles) { - // TODO(crbug.com/1208199): Refactor StartupBrowserCreator and use the - // state struct here. - StartupBrowserCreator startup_browser_creator; - startup_browser_creator.LaunchBrowserForLastProfiles( - command_line, cur_dir, process_startup, is_first_run, profile_info, - last_opened_profiles); - }, - command_line, cur_dir, process_startup, is_first_run, profile_info, - last_opened_profiles); - - return web_app::startup::MaybeLaunchUrlHandlerWebAppFromCmd( - command_line, cur_dir, std::move(on_urls_unhandled_cb), - base::BindOnce(&web_app::startup::FinalizeWebAppLaunch, absl::nullopt, - command_line, is_first_run)); -} -#endif - // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. Updates need to be reflected in // enum IncognitoForcedStart in tools/metrics/histograms/enums.xml. @@ -836,24 +800,6 @@ #endif // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) } -#if BUILDFLAG(IS_MAC) -// static -void StartupBrowserCreator::MaybeHandleProfileAgnosticUrls( - const std::vector<GURL>& urls, - base::OnceCallback<void()> on_urls_unhandled_cb) { - chrome::startup::IsFirstRun is_first_run = - first_run::IsChromeFirstRun() ? chrome::startup::IsFirstRun::kYes - : chrome::startup::IsFirstRun::kNo; - - // Web app URL handling. - web_app::startup::MaybeLaunchUrlHandlerWebAppFromUrls( - urls, std::move(on_urls_unhandled_cb), - base::BindOnce(&web_app::startup::FinalizeWebAppLaunch, absl::nullopt, - base::CommandLine(base::CommandLine::NO_PROGRAM), - is_first_run)); -} -#endif // BUILDFLAG(IS_MAC) - // static bool StartupBrowserCreator::ShouldLoadProfileWithoutWindow( const base::CommandLine& command_line) { @@ -1216,22 +1162,9 @@ return true; } - bool handled_as_app = - // Try a web app launch (--app-id is present). - web_app::startup::MaybeHandleWebAppLaunch( - command_line, cur_dir, privacy_safe_profile, is_first_run); - -#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) - handled_as_app = handled_as_app || - // Give web apps a chance to handle a URL. - MaybeLaunchUrlHandlerWebAppFromCmd( - command_line, cur_dir, process_startup, is_first_run, - profile_info, last_opened_profiles); -#endif - - // If the app launch succeeded, we don't need to continue with a browser - // launch. - if (handled_as_app) + // Try a web app launch (--app-id is present). + if (web_app::startup::MaybeHandleWebAppLaunch( + command_line, cur_dir, privacy_safe_profile, is_first_run)) return true; LaunchBrowserForLastProfiles(command_line, cur_dir, process_startup,
diff --git a/chrome/browser/ui/startup/startup_browser_creator.h b/chrome/browser/ui/startup/startup_browser_creator.h index 1b77f3a7..a6f6b16d 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.h +++ b/chrome/browser/ui/startup/startup_browser_creator.h
@@ -164,15 +164,6 @@ static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); static void RegisterProfilePrefs(PrefRegistrySimple* registry); -#if BUILDFLAG(IS_MAC) - // Searches for web apps to handle `urls` and prompts the user to pick one. - // Runs `on_urls_unhandled_cb` (either synchronously or asynchronously) if no - // web app is found or selected to open `urls`. - static void MaybeHandleProfileAgnosticUrls( - const std::vector<GURL>& urls, - base::OnceClosure on_urls_unhandled_cb); -#endif - // Returns true if Chrome is intended to load a profile and launch without any // window. static bool ShouldLoadProfileWithoutWindow(
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index 0ce9d2c..46f22d9c 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -154,14 +154,7 @@ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -#include "chrome/browser/ui/startup/web_app_url_handling_startup_test_utils.h" -#include "chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h" #include "chrome/browser/ui/web_applications/app_browser_controller.h" -#include "chrome/browser/web_applications/os_integration/url_handler_manager_impl.h" -#include "components/services/app_service/public/cpp/url_handler_info.h" -#include "extensions/browser/extension_dialog_auto_confirm.h" - -using web_app::StartupBrowserWebAppUrlHandlingTest; #endif using testing::Return; @@ -2469,342 +2462,6 @@ #endif // !BUILDFLAG(IS_CHROMEOS_LACROS) #endif // !BUILDFLAG(IS_CHROMEOS_ASH) -// URL Handling tests. -#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogCancelled_NoLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - SetUpCommandlineAndStart(start_url); - - // The waiter will get the dialog when it shows up and close it. - waiter.WaitIfNeededAndGet()->CloseWithReason( - views::Widget::ClosedReason::kEscKeyPressed); - - // When dialog is closed, nothing will happen. - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_BrowserLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Select the first choice, which is the browser. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 0); - SetUpCommandlineAndStart(start_url); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // When dialog is closed, URL will be launched in a browser window. - // Check for new browser window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - Browser* other_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(other_browser); - ASSERT_FALSE( - web_app::AppBrowserController::IsForWebApp(other_browser, app_id)); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_RememberBrowserLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - base::HistogramTester histogram_tester; - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - auto command_line = SetUpCommandLineWithUrl(start_url); - // Get matches before dialog launch. - auto url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line); - - // Select and remember the first choice, which is the browser. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_REMEMBER_OPTION, 0); - Start(command_line); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState:: - kBrowserAcceptedAndRememberChoice, - 1); - - // When dialog is closed, URL will be launched in a browser window. - // Check for new browser window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - Browser* other_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(other_browser); - ASSERT_FALSE( - web_app::AppBrowserController::IsForWebApp(other_browser, app_id)); - - // Get matches after dialog is closed. - auto new_url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line); - ASSERT_NE(url_handler_matches, new_url_handler_matches); - // Verify opening in browser is saved as the default choice (i.e. no matches - // found). - ASSERT_TRUE(new_url_handler_matches.empty()); - - // Close the browser window and start with the same command line again. - // Browser should be launched directly. - CloseBrowserSynchronously(other_browser); - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - Start(command_line); - // Verify browser window is launched. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - other_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(other_browser); - ASSERT_FALSE( - web_app::AppBrowserController::IsForWebApp(other_browser, app_id)); - - // Dialog wasn't shown, the total count of dialog state stays the same. - histogram_tester.ExpectTotalCount("WebApp.UrlHandling.DialogState", 1); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_RememberWebAppLaunch) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - base::HistogramTester histogram_tester; - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - auto command_line = SetUpCommandLineWithUrl(start_url); - // Get matches before dialog launch. - auto url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line); - - // Select and remember the second choice, which is the app. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_REMEMBER_OPTION, 1); - Start(command_line); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState:: - kAppAcceptedAndRememberChoice, - 1); - - // Check for new app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - Browser* app_browser; - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(start_url), web_contents->GetVisibleURL()); - - // Get matches after dialog is closed. - auto new_url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line); - ASSERT_NE(url_handler_matches, new_url_handler_matches); - - // Close the app window and start with the same command line again. App - // should be launched directly. - CloseBrowserSynchronously(app_browser); - ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); - Start(command_line); - ui_test_utils::WaitForBrowserToOpen(); - // Verify app window is launched. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_WebAppLaunch_InScopeUrl) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Select the second choice, which is the app. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 1); - // start_url is in app scope. - SetUpCommandlineAndStart(start_url); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // Check for new app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - Browser* app_browser; - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(kStartUrl), web_contents->GetVisibleURL()); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - DialogAccepted_WebAppLaunch_DifferentOriginUrl) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL("https://example.com")); - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // Select the second choice, which is the app. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 1); - // URL is not in app scope but matches url_handlers of installed app. - constexpr char kTargetUrl[] = "https://example.com/abc/def"; - SetUpCommandlineAndStart(kTargetUrl); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // Check for new app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - Browser* app_browser; - app_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(app_browser); - ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); - - // Out-of-scope URL launch should open new app window and navigate to the - // out-of-scope URL. - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(kTargetUrl), web_contents->GetVisibleURL()); -} - -// TODO(crbug.com/1226532): This test is flaky on Windows. Fix and reenable it. -#if BUILDFLAG(IS_WIN) -#define MAYBE_MultipleProfiles_DialogAccepted_WebAppLaunch_InScopeUrl \ - DISABLED_MultipleProfiles_DialogAccepted_WebAppLaunch_InScopeUrl -#else -#define MAYBE_MultipleProfiles_DialogAccepted_WebAppLaunch_InScopeUrl \ - MultipleProfiles_DialogAccepted_WebAppLaunch_InScopeUrl -#endif - -IN_PROC_BROWSER_TEST_F( - StartupBrowserWebAppUrlHandlingTest, - MAYBE_MultipleProfiles_DialogAccepted_WebAppLaunch_InScopeUrl) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - // Create profiles and install URL Handling apps. - ProfileManager* profile_manager = g_browser_process->profile_manager(); - base::FilePath dest_path = profile_manager->user_data_dir(); - Profile* profile1 = nullptr; - Profile* profile2 = nullptr; - { - base::ScopedAllowBlockingForTesting allow_blocking; - profile1 = profile_manager->GetProfile( - dest_path.Append(FILE_PATH_LITERAL("New Profile 1"))); - ASSERT_TRUE(profile1); - - profile2 = profile_manager->GetProfile( - dest_path.Append(FILE_PATH_LITERAL("New Profile 2"))); - ASSERT_TRUE(profile2); - } - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id_1 = web_app::test::InstallWebAppWithUrlHandlers( - profile1, GURL(start_url), app_name, {url_handler}); - web_app::AppId app_id_2 = web_app::test::InstallWebAppWithUrlHandlers( - profile2, GURL(start_url), app_name, {url_handler}); - - // Test that we should be able to select the 3rd option. - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 2); - // start_url is in app scope for both apps. - SetUpCommandlineAndStart(start_url); - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - - // There should be one app window. No deterministic ordering of apps, so find - // which profile app is launched. - ASSERT_EQ(1u, chrome::GetBrowserCount(profile1) + - chrome::GetBrowserCount(profile2)); - Profile* app_profile = - (chrome::GetBrowserCount(profile1) == 1) ? profile1 : profile2; - Browser* app_browser = chrome::FindBrowserWithProfile(app_profile); - ASSERT_TRUE(app_browser); - ASSERT_TRUE( - web_app::AppBrowserController::IsForWebApp(app_browser, app_id_1) || - web_app::AppBrowserController::IsForWebApp(app_browser, app_id_2)); - - TabStripModel* tab_strip = app_browser->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); - content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); - EXPECT_EQ(GURL(kStartUrl), web_contents->GetVisibleURL()); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, - CheckHistogramsFired) { - base::HistogramTester histogram_tester; - - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "WebAppUrlHandlerIntentPickerView"); - - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL(start_url)); - - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - SetUpCommandlineAndStart(start_url); - - // The waiter will get the dialog when it shows up and close it. - waiter.WaitIfNeededAndGet()->CloseWithReason( - views::Widget::ClosedReason::kEscKeyPressed); - - histogram_tester.ExpectTotalCount( - "WebApp.UrlHandling.GetValidProfilesAtStartUp", 1); - histogram_tester.ExpectTotalCount( - "WebApp.UrlHandling.LoadWebAppRegistrarsAtStartUp", 1); - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState::kClosed, 1); -} - -IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, UrlNotCaptured) { - apps::UrlHandlerInfo url_handler; - url_handler.origin = url::Origin::Create(GURL("https://example.com")); - web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); - - // This URL is not in scope of installed app and does not match url_handlers. - SetUpCommandlineAndStart("https://en.example.com/abc/def"); - - // Check that new window is not app window. - ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); - ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); - Browser* other_browser = FindOneOtherBrowser(browser()); - ASSERT_TRUE(other_browser); - ASSERT_FALSE( - web_app::AppBrowserController::IsForWebApp(other_browser, app_id)); -} -#endif - #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) class StartupBrowserWebAppProtocolHandlingTest : public InProcessBrowserTest {
diff --git a/chrome/browser/ui/startup/web_app_startup_utils.cc b/chrome/browser/ui/startup/web_app_startup_utils.cc index 972305e..0570a70d 100644 --- a/chrome/browser/ui/startup/web_app_startup_utils.cc +++ b/chrome/browser/ui/startup/web_app_startup_utils.cc
@@ -54,8 +54,6 @@ namespace { -using content::ProtocolHandler; - base::OnceClosure& GetStartupDoneCallback() { static base::NoDestructor<base::OnceClosure> instance; return *instance; @@ -200,7 +198,7 @@ OsIntegrationManager& os_integration_manager = provider->os_integration_manager(); - const std::vector<ProtocolHandler> handlers = + const std::vector<custom_handlers::ProtocolHandler> handlers = os_integration_manager.GetHandlersForProtocol(protocol_url.scheme()); // TODO(https://crbug.com/1249907): This code should be simplified such that
diff --git a/chrome/browser/ui/startup/web_app_url_handling_startup_test_utils.h b/chrome/browser/ui/startup/web_app_url_handling_startup_test_utils.h deleted file mode 100644 index 9db66c9..0000000 --- a/chrome/browser/ui/startup/web_app_url_handling_startup_test_utils.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_TEST_UTILS_H_ -#define CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_TEST_UTILS_H_ - -#include <memory> -#include <string> -#include <vector> - -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/web_applications/test/fake_web_app_provider.h" -#include "chrome/browser/web_applications/web_app_id.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "components/services/app_service/public/cpp/url_handler_info.h" - -namespace base { -class CommandLine; -} - -namespace views { -class Widget; -} - -class KeyedService; -class Profile; - -namespace web_app { - -class StartupBrowserWebAppUrlHandlingTest : public InProcessBrowserTest { - protected: - StartupBrowserWebAppUrlHandlingTest(); - ~StartupBrowserWebAppUrlHandlingTest() override; - - AppId InstallWebAppWithUrlHandlers( - const std::vector<apps::UrlHandlerInfo>& url_handlers); - - base::CommandLine SetUpCommandLineWithUrl(const std::string& url); - - void Start(const base::CommandLine& command_line); - - void SetUpCommandlineAndStart(const std::string& url); - - void AutoCloseDialog(views::Widget* widget); - - std::string start_url; - std::u16string app_name; - - private: - static std::unique_ptr<KeyedService> CreateFakeWebAppProvider( - Profile* profile); - - FakeWebAppProviderCreator fake_web_app_provider_creator_; - base::test::ScopedFeatureList scoped_feature_list_; -}; - -} // namespace web_app - -#endif // CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_TEST_UTILS_H_
diff --git a/chrome/browser/ui/startup/web_app_url_handling_startup_utils.cc b/chrome/browser/ui/startup/web_app_url_handling_startup_utils.cc deleted file mode 100644 index 5da700b..0000000 --- a/chrome/browser/ui/startup/web_app_url_handling_startup_utils.cc +++ /dev/null
@@ -1,159 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/startup/web_app_url_handling_startup_utils.h" - -#include <utility> -#include <vector> - -#include "base/command_line.h" -#include "base/files/file_path.h" -#include "chrome/browser/apps/app_service/app_service_proxy.h" -#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" -#include "chrome/browser/apps/app_service/browser_app_launcher.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/first_run/first_run.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_dialogs.h" -#include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/startup/startup_browser_creator.h" -#include "chrome/browser/ui/startup/startup_browser_creator_impl.h" -#include "chrome/browser/web_applications/os_integration/url_handler_manager_impl.h" -#include "chrome/browser/web_applications/url_handler_launch_params.h" -#include "chrome/common/chrome_switches.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "url/gurl.h" - -namespace web_app { - -namespace { - -void LaunchApp(const base::FilePath& profile_path, - const AppId& app_id, - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - const GURL& url, - startup::FinalizeWebAppLaunchCallback callback) { - apps::AppServiceProxyFactory::GetForProfile( - g_browser_process->profile_manager()->GetProfile(profile_path)) - ->BrowserAppLauncher() - ->LaunchAppWithCallback(app_id, command_line, cur_dir, url, - /*protocol_handler_launch_url=*/absl::nullopt, - /*launch_files=*/{}, std::move(callback)); -} - -void OnUrlHandlerIntentPickerDialogCompleted( - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - base::OnceClosure on_urls_unhandled_cb, - startup::FinalizeWebAppLaunchCallback app_launched_callback, - bool accepted, - absl::optional<UrlHandlerLaunchParams> selected_match) { - // Dialog is not accepted. Quit the process and do nothing. - if (!accepted) - return; - - if (selected_match.has_value()) { - // The user has selected an app to handle the URL. - LaunchApp(selected_match->profile_path, selected_match->app_id, - command_line, cur_dir, selected_match->url, - std::move(app_launched_callback)); - } else { - // The user has selected the browser. Open the link in the browser. - std::move(on_urls_unhandled_cb).Run(); - } -} - -bool ShouldLaunchSavedChoice( - const std::vector<UrlHandlerLaunchParams>& url_handler_matches) { - return url_handler_matches.size() == 1 && - url_handler_matches.front().saved_choice == - UrlHandlerSavedChoice::kInApp; -} - -void LaunchSavedChoice( - const std::vector<UrlHandlerLaunchParams>& url_handler_matches, - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - startup::FinalizeWebAppLaunchCallback app_launched_callback) { - // Default choice found. The first match returned is the saved choice, - // which should be launched directly. Do not show the dialog. - const UrlHandlerLaunchParams& saved_choice = url_handler_matches.front(); - LaunchApp(saved_choice.profile_path, saved_choice.app_id, command_line, - cur_dir, saved_choice.url, std::move(app_launched_callback)); -} - -// Returns true if `url` is handled, either by launching an app or showing a -// dialog with all matching URL Handling apps. Returns false otherwise. -// If `should_process_unhandled_url` is true, `on_urls_unhandled_cb` will be -// run to handle `url`. -bool MaybeHandleUrl( - const GURL& url, - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - bool should_process_unhandled_url, - base::OnceClosure on_urls_unhandled_cb, - startup::FinalizeWebAppLaunchCallback app_launched_callback) { - auto matches = UrlHandlerManagerImpl::GetUrlHandlerMatches(url); - if (matches.empty()) { - if (should_process_unhandled_url) - std::move(on_urls_unhandled_cb).Run(); - return false; - } - - if (ShouldLaunchSavedChoice(matches)) { - // TODO(crbug.com/1217419): Verify if site permission is enabled. - LaunchSavedChoice(matches, command_line, cur_dir, - std::move(app_launched_callback)); - return true; - } - - chrome::ShowWebAppUrlHandlerIntentPickerDialog( - url, std::move(matches), - base::BindOnce(&OnUrlHandlerIntentPickerDialogCompleted, command_line, - cur_dir, std::move(on_urls_unhandled_cb), - std::move(app_launched_callback))); - return true; -} - -} // namespace - -namespace startup { - -bool MaybeLaunchUrlHandlerWebAppFromCmd( - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - base::OnceClosure on_urls_unhandled_cb, - FinalizeWebAppLaunchCallback app_launched_callback) { - absl::optional<GURL> url = - UrlHandlerManagerImpl::GetUrlFromCommandLine(command_line); - if (!url) - return false; - - return MaybeHandleUrl(url.value(), command_line, cur_dir, - /*should_process_unhandled_url=*/false, - std::move(on_urls_unhandled_cb), - std::move(app_launched_callback)); -} - -void MaybeLaunchUrlHandlerWebAppFromUrls( - const std::vector<GURL>& urls, - base::OnceClosure on_urls_unhandled_cb, - FinalizeWebAppLaunchCallback app_launched_callback) { - if (urls.size() != 1) { - std::move(on_urls_unhandled_cb).Run(); - return; - } - - MaybeHandleUrl(urls.front(), base::CommandLine(base::CommandLine::NO_PROGRAM), - base::FilePath(), /*should_process_unhandled_url=*/true, - std::move(on_urls_unhandled_cb), - std::move(app_launched_callback)); -} - -} // namespace startup -} // namespace web_app
diff --git a/chrome/browser/ui/startup/web_app_url_handling_startup_utils.h b/chrome/browser/ui/startup/web_app_url_handling_startup_utils.h deleted file mode 100644 index c1b72ec..0000000 --- a/chrome/browser/ui/startup/web_app_url_handling_startup_utils.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_UTILS_H_ -#define CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_UTILS_H_ - -#include <vector> - -#include "base/callback.h" -#include "components/services/app_service/public/mojom/types.mojom.h" - -namespace base { -class CommandLine; -class FilePath; -} // namespace base - -class Browser; -class GURL; - -namespace web_app { -namespace startup { - -using FinalizeWebAppLaunchCallback = - base::OnceCallback<void(Browser* browser, - apps::mojom::LaunchContainer container)>; - -// If `command_line` contains a single URL argument and that URL matches URL -// handling registration from installed web apps, show app options to user and -// launch one if accepted. -// Returns true if matching web apps are found, false otherwise. -bool MaybeLaunchUrlHandlerWebAppFromCmd( - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - base::OnceClosure on_urls_unhandled_cb, - FinalizeWebAppLaunchCallback app_launched_callback); - -// Checks if `urls` contains a single URL that can be handled by installed web -// app URL handlers, show app options to user and launch one if accepted. -// Otherwise, run `on_urls_unhandled_cb` to open `urls` in the browser. -void MaybeLaunchUrlHandlerWebAppFromUrls( - const std::vector<GURL>& urls, - base::OnceClosure on_urls_unhandled_cb, - FinalizeWebAppLaunchCallback app_launched_callback); - -} // namespace startup -} // namespace web_app - -#endif // CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_UTILS_H_
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc index f6ddeb96..242bfe77 100644 --- a/chrome/browser/ui/tabs/tab_strip_model.cc +++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -2352,13 +2352,30 @@ } } - GroupTab(index, new_group.value()); + absl::optional<tab_groups::TabGroupId> old_group = GetTabGroupForTab(index); + if (old_group.has_value()) { + // TODO (1302144): We don't maintain group contiguity in this case. If + // |index| is in the middle of |old_group|, GroupTab will notify observers + // while |old_group| is split in twain. Simply reordering the move and + // group actions won't do it; we'd need to move, ungroup, move, and then + // group. + GroupTab(index, new_group.value()); + if (index != new_index) + MoveWebContentsAtImpl(index, new_index, false); + } else { + // Move the tab now so that group contiguity is preserved. + // When grouping, this will move the tab next to |new_group|. + if (index != new_index) + MoveWebContentsAtImpl(index, new_index, false); + GroupTab(new_index, new_group.value()); + } } else { - UngroupTab(index); + // Move the tab now so that group contiguity is preserved. + // When ungrouping, this will move the tab to the edge of |old_group|. + if (index != new_index) + MoveWebContentsAtImpl(index, new_index, false); + UngroupTab(new_index); } - - if (index != new_index) - MoveWebContentsAtImpl(index, new_index, false); } void TabStripModel::AddToReadLaterImpl(const std::vector<int>& indices) {
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc index 09d3283..026ff21 100644 --- a/chrome/browser/ui/views/download/download_item_view.cc +++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -41,8 +41,8 @@ #include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h" #include "chrome/browser/safe_browsing/download_protection/download_protection_service.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" -#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/tab_modal_confirm_dialog.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/views/chrome_typography.h" @@ -66,7 +66,6 @@ #include "ui/base/metadata/metadata_header_macros.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/text/bytes_formatting.h" -#include "ui/base/theme_provider.h" #include "ui/base/ui_base_types.h" #include "ui/color/color_id.h" #include "ui/compositor/layer.h" @@ -611,8 +610,7 @@ gfx::Rect rect(width() - 1, 0, 1, height()); rect.Inset(0, kTopBottomPadding); canvas->FillRect(GetMirroredRect(rect), - GetThemeProvider()->GetColor( - ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR)); + GetColorProvider()->GetColor(kColorToolbarSeparator)); } void DownloadItemView::OnPaint(gfx::Canvas* canvas) { @@ -699,7 +697,7 @@ views::View::OnThemeChanged(); const SkColor background_color = - GetThemeProvider()->GetColor(ThemeProperties::COLOR_DOWNLOAD_SHELF); + GetColorProvider()->GetColor(kColorDownloadShelf); SetBackground(views::CreateSolidBackground(background_color)); shelf_->ConfigureButtonForTheme(open_now_button_); @@ -1281,7 +1279,7 @@ dropdown_button_, dropdown_pressed_ ? vector_icons::kCaretDownIcon : vector_icons::kCaretUpIcon, - GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR_TEXT)); + GetColorProvider()->GetColor(kColorToolbarText)); dropdown_button_->SizeToPreferredSize(); }
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc index 8acb679..a5ca753 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -173,18 +173,6 @@ SchedulePaint(); } -SkColor BrowserNonClientFrameView::GetToolbarTopSeparatorColor() const { - const int color_id = - ShouldPaintAsActive() - ? ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR - : ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE; - // The vertical tab separator might show through the stroke if the stroke - // color is translucent. To prevent this, always use an opaque stroke color. - return color_utils::GetResultingPaintColor( - GetThemeProvider()->GetColor(color_id), - GetFrameColor(BrowserFrameActiveState::kUseCurrent)); -} - absl::optional<int> BrowserNonClientFrameView::GetCustomBackgroundId( BrowserFrameActiveState active_state) const { const ui::ThemeProvider* tp = GetThemeProvider();
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h index 365b329..9e106494 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
@@ -109,10 +109,6 @@ // to be repainted. virtual void UpdateFrameColor(); - // Returns COLOR_TOOLBAR_TOP_SEPARATOR[,_INACTIVE] depending on the activation - // state of the window. - SkColor GetToolbarTopSeparatorColor() const; - // For non-transparent windows, returns the background tab image resource ID // if the image has been customized, directly or indirectly, by the theme. absl::optional<int> GetCustomBackgroundId(
diff --git a/chrome/browser/ui/views/frame/browser_root_view.cc b/chrome/browser/ui/views/frame/browser_root_view.cc index 05ec7b5c..14f28b07e 100644 --- a/chrome/browser/ui/views/frame/browser_root_view.cc +++ b/chrome/browser/ui/views/frame/browser_root_view.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" #include "chrome/browser/defaults.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -340,8 +341,16 @@ } canvas->UndoDeviceScaleFactor(); + const auto* widget = GetWidget(); + DCHECK(widget); + const SkColor toolbar_top_separator_color = + widget->GetThemeProvider()->GetColor( + tabstrip()->ShouldPaintAsActiveFrame() + ? ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE + : ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE); + cc::PaintFlags flags; - flags.setColor(tabstrip()->GetToolbarTopSeparatorColor()); + flags.setColor(toolbar_top_separator_color); flags.setStyle(cc::PaintFlags::kFill_Style); flags.setAntiAlias(true); canvas->DrawRect(gfx::RectF(x, bottom - scale, width, scale), flags);
diff --git a/chrome/browser/ui/views/frame/contents_web_view.cc b/chrome/browser/ui/views/frame/contents_web_view.cc index 28637cc..5f985ef 100644 --- a/chrome/browser/ui/views/frame/contents_web_view.cc +++ b/chrome/browser/ui/views/frame/contents_web_view.cc
@@ -44,7 +44,8 @@ void ContentsWebView::SetBackgroundColorOverride( absl::optional<SkColor> background_color) { background_color_override_ = background_color; - UpdateBackgroundColor(); + if (GetWidget()) + UpdateBackgroundColor(); } bool ContentsWebView::GetNeedsNotificationWhenVisibleBoundsChange() const { @@ -56,59 +57,37 @@ status_bubble_->Reposition(); } -void ContentsWebView::ViewHierarchyChanged( - const views::ViewHierarchyChangedDetails& details) { - WebView::ViewHierarchyChanged(details); - if (details.is_add) - UpdateBackgroundColor(); -} - void ContentsWebView::OnThemeChanged() { views::WebView::OnThemeChanged(); UpdateBackgroundColor(); } void ContentsWebView::OnLetterboxingChanged() { - UpdateBackgroundColor(); -} - -absl::optional<SkColor> ContentsWebView::GetBackgroundColor() { - if (background_color_override_.has_value()) - return background_color_override_; - - const ui::ThemeProvider* const theme = GetThemeProvider(); - if (!theme) - return absl::nullopt; - - return color_utils::GetResultingPaintColor( - theme->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND), SK_ColorWHITE); + if (GetWidget()) + UpdateBackgroundColor(); } void ContentsWebView::UpdateBackgroundColor() { - const absl::optional<SkColor> background_color = GetBackgroundColor(); - if (!background_color.has_value()) - return; - - const SkColor ntp_background = background_color.value(); + // TODO(pkasting): In a Color Pipeline world, COLOR_NTP_BACKGROUND should get + // overridden by PWA windows in their mixer chain as necessary. Then the + // override here can go away, and the custom calculations for the letterboxing + // case can become a separate color (recipe) in the main chrome mixer. + SkColor ntp_background = background_color_override_.value_or( + GetThemeProvider()->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND)); if (is_letterboxing()) { // Set the background color to a dark tint of the new tab page's background // color. This is the color filled within the WebView's bounds when its // child view is sized specially for fullscreen tab capture. See WebView // header file comments for more details. - const int kBackgroundBrightness = 0x33; // 20% + constexpr SkAlpha kBackgroundBrightness = 0x33; // 20% // Make sure the background is opaque. - const SkColor dimmed_ntp_background = SkColorSetARGB( + ntp_background = SkColorSetARGB( SkColorGetA(ntp_background), - SkColorGetR(ntp_background) * kBackgroundBrightness / 0xFF, - SkColorGetG(ntp_background) * kBackgroundBrightness / 0xFF, - SkColorGetB(ntp_background) * kBackgroundBrightness / 0xFF); - SetBackground(views::CreateSolidBackground(dimmed_ntp_background)); - } else { - SetBackground(views::CreateSolidBackground(ntp_background)); + SkColorGetR(ntp_background) * kBackgroundBrightness / SK_AlphaOPAQUE, + SkColorGetG(ntp_background) * kBackgroundBrightness / SK_AlphaOPAQUE, + SkColorGetB(ntp_background) * kBackgroundBrightness / SK_AlphaOPAQUE); } - // Changing a view's background does not necessarily schedule the view to be - // redrawn. - SchedulePaint(); + SetBackground(views::CreateSolidBackground(ntp_background)); if (web_contents()) { content::RenderWidgetHostView* rwhv = @@ -171,7 +150,8 @@ void ContentsWebView::RenderViewReady() { // Set the background color to be the theme's ntp background on startup. - UpdateBackgroundColor(); + if (GetWidget()) + UpdateBackgroundColor(); WebView::RenderViewReady(); }
diff --git a/chrome/browser/ui/views/frame/contents_web_view.h b/chrome/browser/ui/views/frame/contents_web_view.h index cab6e0fa..4bc88b9 100644 --- a/chrome/browser/ui/views/frame/contents_web_view.h +++ b/chrome/browser/ui/views/frame/contents_web_view.h
@@ -42,8 +42,6 @@ // WebView overrides: bool GetNeedsNotificationWhenVisibleBoundsChange() const override; void OnVisibleBoundsChanged() override; - void ViewHierarchyChanged( - const views::ViewHierarchyChangedDetails& details) override; void OnThemeChanged() override; void RenderViewReady() override; void OnLetterboxingChanged() override; @@ -56,7 +54,6 @@ void DestroyClonedLayer() override; private: - absl::optional<SkColor> GetBackgroundColor(); void UpdateBackgroundColor(); StatusBubbleViews* status_bubble_;
diff --git a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc index 633c432..b1d7b0f 100644 --- a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc
@@ -159,8 +159,9 @@ } case ContentSettingsType::PROTOCOL_HANDLERS: chrome::PageSpecificContentSettingsDelegate::FromWebContents(web_contents) - ->set_pending_protocol_handler(ProtocolHandler::CreateProtocolHandler( - "mailto", GURL("https://example.com/"))); + ->set_pending_protocol_handler( + custom_handlers::ProtocolHandler::CreateProtocolHandler( + "mailto", GURL("https://example.com/"))); break; default:
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc index 5de822e2..804d7ab 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc
@@ -159,8 +159,9 @@ permissions::PermissionRequest* MakeRegisterProtocolHandlerRequest() { std::string protocol = "mailto"; - ProtocolHandler handler = - ProtocolHandler::CreateProtocolHandler(protocol, GetTestUrl()); + custom_handlers::ProtocolHandler handler = + custom_handlers::ProtocolHandler::CreateProtocolHandler(protocol, + GetTestUrl()); custom_handlers::ProtocolHandlerRegistry* registry = ProtocolHandlerRegistryFactory::GetForBrowserContext( browser()->profile());
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc index b6f9760970..0f4b16e 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -576,10 +576,6 @@ return GetFrameView()->GetFrameColor(active_state); } -SkColor BrowserTabStripController::GetToolbarTopSeparatorColor() const { - return GetFrameView()->GetToolbarTopSeparatorColor(); -} - absl::optional<int> BrowserTabStripController::GetCustomBackgroundId( BrowserFrameActiveState active_state) const { return GetFrameView()->GetCustomBackgroundId(active_state);
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h index c59fa72..8929cd77 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -114,7 +114,6 @@ bool ShouldPaintAsActiveFrame() const override; bool CanDrawStrokes() const override; SkColor GetFrameColor(BrowserFrameActiveState active_state) const override; - SkColor GetToolbarTopSeparatorColor() const override; absl::optional<int> GetCustomBackgroundId( BrowserFrameActiveState active_state) const override; std::u16string GetAccessibleTabName(const Tab* tab) const override;
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc index 8decca85..f100972 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
@@ -290,10 +290,6 @@ return gfx::kPlaceholderColor; } -SkColor FakeBaseTabStripController::GetToolbarTopSeparatorColor() const { - return gfx::kPlaceholderColor; -} - absl::optional<int> FakeBaseTabStripController::GetCustomBackgroundId( BrowserFrameActiveState active_state) const { return absl::nullopt;
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h index a3de87d..f1fec64 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -90,7 +90,6 @@ bool ShouldPaintAsActiveFrame() const override; bool CanDrawStrokes() const override; SkColor GetFrameColor(BrowserFrameActiveState active_state) const override; - SkColor GetToolbarTopSeparatorColor() const override; absl::optional<int> GetCustomBackgroundId( BrowserFrameActiveState active_state) const override; std::u16string GetAccessibleTabName(const Tab* tab) const override;
diff --git a/chrome/browser/ui/views/tabs/fake_tab_controller.cc b/chrome/browser/ui/views/tabs/fake_tab_controller.cc index 23b126b2..1062b36 100644 --- a/chrome/browser/ui/views/tabs/fake_tab_controller.cc +++ b/chrome/browser/ui/views/tabs/fake_tab_controller.cc
@@ -68,10 +68,6 @@ return false; } -SkColor FakeTabController::GetToolbarTopSeparatorColor() const { - return SK_ColorBLACK; -} - SkColor FakeTabController::GetTabSeparatorColor() const { return SK_ColorBLACK; }
diff --git a/chrome/browser/ui/views/tabs/fake_tab_controller.h b/chrome/browser/ui/views/tabs/fake_tab_controller.h index bd140d5..89698a9 100644 --- a/chrome/browser/ui/views/tabs/fake_tab_controller.h +++ b/chrome/browser/ui/views/tabs/fake_tab_controller.h
@@ -60,7 +60,6 @@ int GetStrokeThickness() const override; bool CanPaintThrobberToLayer() const override; bool HasVisibleBackgroundTabShapes() const override; - SkColor GetToolbarTopSeparatorColor() const override; SkColor GetTabSeparatorColor() const override; SkColor GetTabBackgroundColor( TabActive active,
diff --git a/chrome/browser/ui/views/tabs/tab_container.cc b/chrome/browser/ui/views/tabs/tab_container.cc index 7ddc358..1693018 100644 --- a/chrome/browser/ui/views/tabs/tab_container.cc +++ b/chrome/browser/ui/views/tabs/tab_container.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/views/tabs/tab_style_views.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/controls/scroll_view.h" #include "ui/views/rect_based_targeting_utils.h" #include "ui/views/view_utils.h" @@ -204,6 +205,48 @@ float z_value_; }; // ZOrderableTabStripElement +// Helper class that manages the tab scrolling animation. +class TabScrollingAnimation : public gfx::LinearAnimation, + public gfx::AnimationDelegate { + public: + explicit TabScrollingAnimation( + views::View* contents_view, + gfx::AnimationContainer* bounds_animator_container, + base::TimeDelta duration, + const gfx::Rect start_visible_rect, + const gfx::Rect end_visible_rect) + : gfx::LinearAnimation(duration, + gfx::LinearAnimation::kDefaultFrameRate, + this), + contents_view_(contents_view), + start_visible_rect_(start_visible_rect), + end_visible_rect_(end_visible_rect) { + SetContainer(bounds_animator_container); + } + TabScrollingAnimation(const TabScrollingAnimation&) = delete; + TabScrollingAnimation& operator=(const TabScrollingAnimation&) = delete; + ~TabScrollingAnimation() override = default; + + void AnimateToState(double state) override { + gfx::Rect intermediary_rect( + start_visible_rect_.x() + + (end_visible_rect_.x() - start_visible_rect_.x()) * state, + start_visible_rect_.y(), start_visible_rect_.width(), + start_visible_rect_.height()); + + contents_view_->ScrollRectToVisible(intermediary_rect); + } + + void AnimationEnded(const gfx::Animation* animation) override { + contents_view_->ScrollRectToVisible(end_visible_rect_); + } + + private: + const raw_ptr<views::View> contents_view_; + const gfx::Rect start_visible_rect_; + const gfx::Rect end_visible_rect_; +}; + } // namespace /////////////////////////////////////////////////////////////////////////////// @@ -241,10 +284,12 @@ TabContainer::TabContainer(TabStripController* controller, TabHoverCardController* hover_card_controller, - TabDragContext* drag_context) + TabDragContext* drag_context, + views::View* scroll_contents_view) : controller_(controller), hover_card_controller_(hover_card_controller), drag_context_(drag_context), + scroll_contents_view_(scroll_contents_view), bounds_animator_(this), layout_helper_(std::make_unique<TabStripLayoutHelper>( controller, @@ -292,6 +337,61 @@ layout_helper_->RemoveTabAt(index, tab); } +void TabContainer::ScrollTabToVisible(int model_index) { + views::ScrollView* scroll_container = + views::ScrollView::GetScrollViewForContents(scroll_contents_view_); + if (!scroll_container) { + return; + } + + // If the tab strip won't be scrollable after the current tabstrip animations + // complete, scroll animation wouldn't be meaningful. + if (tabs_view_model_.ideal_bounds(GetTabCount() - 1).right() <= + GetAvailableWidthForTabContainer()) + return; + + if (tab_scrolling_animation_) + tab_scrolling_animation_->Stop(); + + gfx::Rect visible_content_rect = scroll_container->GetVisibleRect(); + gfx::Rect active_tab_ideal_bounds = + tabs_view_model_.ideal_bounds(model_index); + + if ((active_tab_ideal_bounds.x() >= visible_content_rect.x()) && + (active_tab_ideal_bounds.right() <= visible_content_rect.right())) { + return; + } + + bool scroll_left = active_tab_ideal_bounds.x() < visible_content_rect.x(); + if (scroll_left) { + // Scroll the left edge of |visible_content_rect| to show the left edge of + // the tab at |model_index|. We can leave the width entirely up to the + // ScrollView. + gfx::Rect start_left_edge(visible_content_rect.x(), + visible_content_rect.y(), 0, 0); + gfx::Rect target_left_edge(active_tab_ideal_bounds.x(), + visible_content_rect.y(), 0, 0); + tab_scrolling_animation_ = std::make_unique<TabScrollingAnimation>( + scroll_contents_view_, bounds_animator().container(), + bounds_animator().GetAnimationDuration(), start_left_edge, + target_left_edge); + tab_scrolling_animation_->Start(); + } else { + // Scroll the right edge of |visible_content_rect| to show the right edge + // of the tab at |model_index|. We can leave the width entirely up to the + // ScrollView. + gfx::Rect start_right_edge(visible_content_rect.right(), + visible_content_rect.y(), 0, 0); + gfx::Rect target_right_edge(active_tab_ideal_bounds.right(), + visible_content_rect.y(), 0, 0); + tab_scrolling_animation_ = std::make_unique<TabScrollingAnimation>( + scroll_contents_view_, bounds_animator().container(), + bounds_animator().GetAnimationDuration(), start_right_edge, + target_right_edge); + tab_scrolling_animation_->Start(); + } +} + void TabContainer::OnGroupCreated(const tab_groups::TabGroupId& group, TabStrip* tab_strip) { auto group_view = std::make_unique<TabGroupViews>(this, tab_strip, group);
diff --git a/chrome/browser/ui/views/tabs/tab_container.h b/chrome/browser/ui/views/tabs/tab_container.h index aafd9aa..032f58a 100644 --- a/chrome/browser/ui/views/tabs/tab_container.h +++ b/chrome/browser/ui/views/tabs/tab_container.h
@@ -31,7 +31,8 @@ TabContainer(TabStripController* controller, TabHoverCardController* hover_card_controller, - TabDragContext* drag_context); + TabDragContext* drag_context, + views::View* scroll_contents_view); ~TabContainer() override; void SetAvailableWidthCallback( @@ -44,6 +45,8 @@ // so it can be animated closed. void RemoveTabFromViewModel(int index); + void ScrollTabToVisible(int model_index); + void OnGroupCreated(const tab_groups::TabGroupId& group, TabStrip* tab_strip); // Opens the editor bubble for the tab |group| as a result of an explicit user @@ -188,9 +191,15 @@ TabDragContext* drag_context_; + // The View that is to be scrolled by |tab_scrolling_animation_|. + views::View* scroll_contents_view_; + // Responsible for animating tabs in response to model changes. views::BoundsAnimator bounds_animator_; + // Responsible for animating the scroll of the tab container. + std::unique_ptr<gfx::LinearAnimation> tab_scrolling_animation_; + std::unique_ptr<TabStripLayoutHelper> layout_helper_; // If this value is defined, it is used as the width to lay out tabs
diff --git a/chrome/browser/ui/views/tabs/tab_container_unittest.cc b/chrome/browser/ui/views/tabs/tab_container_unittest.cc index b484f5fa..545ee4df 100644 --- a/chrome/browser/ui/views/tabs/tab_container_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_container_unittest.cc
@@ -23,7 +23,7 @@ tab_strip_controller_ = std::make_unique<FakeBaseTabStripController>(); tab_container_ = std::make_unique<TabContainer>( tab_strip_controller_.get(), nullptr /*hover_card_controller*/, - nullptr /*drag_context*/); + nullptr /*drag_context*/, nullptr /*scroll_contents_view*/); tab_controller_ = std::make_unique<FakeTabController>(); }
diff --git a/chrome/browser/ui/views/tabs/tab_controller.h b/chrome/browser/ui/views/tabs/tab_controller.h index c257a70..09513f10 100644 --- a/chrome/browser/ui/views/tabs/tab_controller.h +++ b/chrome/browser/ui/views/tabs/tab_controller.h
@@ -163,10 +163,6 @@ // active. virtual bool ShouldPaintAsActiveFrame() const = 0; - // Returns COLOR_TOOLBAR_TOP_SEPARATOR[,_INACTIVE] depending on the activation - // state of the window. - virtual SkColor GetToolbarTopSeparatorColor() const = 0; - // Returns the color of the separator between the tabs. virtual SkColor GetTabSeparatorColor() const = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 61475f41..8781f06 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -135,48 +135,6 @@ : TabDragController::EVENT_SOURCE_MOUSE; } -// Helper class that manages the tab scrolling animation. -class TabScrollingAnimation : public gfx::LinearAnimation, - public gfx::AnimationDelegate { - public: - explicit TabScrollingAnimation( - TabStrip* tab_strip, - gfx::AnimationContainer* bounds_animator_container, - base::TimeDelta duration, - const gfx::Rect start_visible_rect, - const gfx::Rect end_visible_rect) - : gfx::LinearAnimation(duration, - gfx::LinearAnimation::kDefaultFrameRate, - this), - tab_strip_(tab_strip), - start_visible_rect_(start_visible_rect), - end_visible_rect_(end_visible_rect) { - SetContainer(bounds_animator_container); - } - TabScrollingAnimation(const TabScrollingAnimation&) = delete; - TabScrollingAnimation& operator=(const TabScrollingAnimation&) = delete; - ~TabScrollingAnimation() override = default; - - void AnimateToState(double state) override { - gfx::Rect intermediary_rect( - start_visible_rect_.x() + - (end_visible_rect_.x() - start_visible_rect_.x()) * state, - start_visible_rect_.y(), start_visible_rect_.width(), - start_visible_rect_.height()); - - tab_strip_->ScrollRectToVisible(intermediary_rect); - } - - void AnimationEnded(const gfx::Animation* animation) override { - tab_strip_->ScrollRectToVisible(end_visible_rect_); - } - - private: - const raw_ptr<TabStrip> tab_strip_; - const gfx::Rect start_visible_rect_; - const gfx::Rect end_visible_rect_; -}; - } // namespace /////////////////////////////////////////////////////////////////////////////// @@ -796,7 +754,8 @@ tab_container_(AddChildView( std::make_unique<TabContainer>(controller_.get(), hover_card_controller_.get(), - drag_context_.get()))) { + drag_context_.get(), + this))) { // TODO(pbos): This is probably incorrect, the background of individual tabs // depend on their selected state. This should probably be pushed down into // tabs. @@ -1005,60 +964,6 @@ EndDrag(END_DRAG_COMPLETE); } -void TabStrip::ScrollTabToVisible(int model_index) { - views::ScrollView* scroll_container = - views::ScrollView::GetScrollViewForContents(this); - if (!scroll_container) { - return; - } - - // If the tab strip won't be scrollable after the current tabstrip animations - // complete, scroll animation wouldn't be meaningful. - if (ideal_bounds(GetTabCount() - 1).right() <= - tab_container_->GetAvailableWidthForTabContainer()) - return; - - if (tab_scrolling_animation_) - tab_scrolling_animation_->Stop(); - - gfx::Rect visible_content_rect = scroll_container->GetVisibleRect(); - gfx::Rect active_tab_ideal_bounds = ideal_bounds(model_index); - - if ((active_tab_ideal_bounds.x() >= visible_content_rect.x()) && - (active_tab_ideal_bounds.right() <= visible_content_rect.right())) { - return; - } - - bool scroll_left = active_tab_ideal_bounds.x() < visible_content_rect.x(); - if (scroll_left) { - // Scroll the left edge of |visible_content_rect| to show the left edge of - // the tab at |model_index|. We can leave the width entirely up to the - // ScrollView. - gfx::Rect start_left_edge(visible_content_rect.x(), - visible_content_rect.y(), 0, 0); - gfx::Rect target_left_edge(active_tab_ideal_bounds.x(), - visible_content_rect.y(), 0, 0); - tab_scrolling_animation_ = std::make_unique<TabScrollingAnimation>( - this, tab_container_->bounds_animator().container(), - tab_container_->bounds_animator().GetAnimationDuration(), - start_left_edge, target_left_edge); - tab_scrolling_animation_->Start(); - } else { - // Scroll the right edge of |visible_content_rect| to show the right edge - // of the tab at |model_index|. We can leave the width entirely up to the - // ScrollView. - gfx::Rect start_right_edge(visible_content_rect.right(), - visible_content_rect.y(), 0, 0); - gfx::Rect target_right_edge(active_tab_ideal_bounds.right(), - visible_content_rect.y(), 0, 0); - tab_scrolling_animation_ = std::make_unique<TabScrollingAnimation>( - this, tab_container_->bounds_animator().container(), - tab_container_->bounds_animator().GetAnimationDuration(), - start_right_edge, target_right_edge); - tab_scrolling_animation_->Start(); - } -} - void TabStrip::SetTabData(int model_index, TabRendererData data) { Tab* tab = tab_at(model_index); const bool pinned = data.pinned; @@ -1249,7 +1154,7 @@ tab_container_->layout_helper()->SetActiveTab(selected_tabs_.active(), new_selection.active()); if (base::FeatureList::IsEnabled(features::kScrollableTabStrip)) { - ScrollTabToVisible(new_selection.active()); + tab_container_->ScrollTabToVisible(new_selection.active()); } } @@ -1669,10 +1574,6 @@ return controller_->ShouldPaintAsActiveFrame(); } -SkColor TabStrip::GetToolbarTopSeparatorColor() const { - return controller_->GetToolbarTopSeparatorColor(); -} - SkColor TabStrip::GetTabSeparatorColor() const { return separator_color_; } @@ -2093,8 +1994,6 @@ last_layout_size_ = size(); tab_container_->bounds_animator().Cancel(); - if (tab_scrolling_animation_) - tab_scrolling_animation_->SetCurrentValue(1); UpdateIdealBounds(); tab_container_->SnapToIdealBounds(); @@ -2741,9 +2640,6 @@ ADD_READONLY_PROPERTY_METADATA(absl::optional<int>, FocusedTabIndex) ADD_READONLY_PROPERTY_METADATA(int, StrokeThickness) ADD_READONLY_PROPERTY_METADATA(SkColor, - ToolbarTopSeparatorColor, - ui::metadata::SkColorConverter) -ADD_READONLY_PROPERTY_METADATA(SkColor, TabSeparatorColor, ui::metadata::SkColorConverter) ADD_READONLY_PROPERTY_METADATA(float, HoverOpacityForRadialHighlight)
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h index 21183fb..f775a570 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.h +++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -143,8 +143,6 @@ int model_index, bool was_active); - void ScrollTabToVisible(int model_index); - // Sets the tab data at the specified model index. void SetTabData(int model_index, TabRendererData data); @@ -295,7 +293,6 @@ bool CanPaintThrobberToLayer() const override; bool HasVisibleBackgroundTabShapes() const override; bool ShouldPaintAsActiveFrame() const override; - SkColor GetToolbarTopSeparatorColor() const override; SkColor GetTabSeparatorColor() const override; SkColor GetTabBackgroundColor( TabActive active, @@ -571,9 +568,6 @@ // The View parent for the tabs and the various group views. TabContainer* tab_container_; - // Responsible for animating the scroll of the tab strip. - std::unique_ptr<gfx::LinearAnimation> tab_scrolling_animation_; - // The background offset used by inactive tabs to match the frame image. int background_offset_ = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h index 7bda6aa..83d34f6b 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -213,10 +213,6 @@ // state. virtual SkColor GetFrameColor(BrowserFrameActiveState active_state) const = 0; - // Returns COLOR_TOOLBAR_TOP_SEPARATOR[,_INACTIVE] depending on the activation - // state of the window. - virtual SkColor GetToolbarTopSeparatorColor() const = 0; - // For non-transparent windows, returns the background tab image resource ID // if the image has been customized, directly or indirectly, by the theme. virtual absl::optional<int> GetCustomBackgroundId(
diff --git a/chrome/browser/ui/views/tabs/tab_style_views.cc b/chrome/browser/ui/views/tabs/tab_style_views.cc index ed7e35b..06af207 100644 --- a/chrome/browser/ui/views/tabs/tab_style_views.cc +++ b/chrome/browser/ui/views/tabs/tab_style_views.cc
@@ -829,9 +829,15 @@ PaintTabBackgroundFill(canvas, active, active == TabActive::kInactive && IsHoverActive(), fill_id, y_inset); - PaintBackgroundStroke( - canvas, active, - group_color.value_or(tab_->controller()->GetToolbarTopSeparatorColor())); + + const auto* widget = tab_->GetWidget(); + DCHECK(widget); + const SkColor tab_stroke_color = widget->GetThemeProvider()->GetColor( + tab_->controller()->ShouldPaintAsActiveFrame() + ? ThemeProperties::COLOR_TAB_STROKE_FRAME_ACTIVE + : ThemeProperties::COLOR_TAB_STROKE_FRAME_INACTIVE); + + PaintBackgroundStroke(canvas, active, group_color.value_or(tab_stroke_color)); PaintSeparators(canvas); }
diff --git a/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc b/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc index 5590151..4597d3a 100644 --- a/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc +++ b/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc
@@ -23,7 +23,6 @@ #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/url_formatter/elide_url.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/views/controls/button/checkbox.h"
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc index 6cd4df2..1081608 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -2151,4 +2151,374 @@ helper_.CheckTabCreated(); } +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteA_24_12SiteA_32SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteA_24_12SiteA_48SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteA_24_12SiteA_28_70SiteA_69SiteA_94_24_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ClosePwa(); + helper_.ManifestUpdateDisplayBrowser("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckTabNotCreated(); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteA_24_12SiteA_28_36SiteA_69SiteA_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ClosePwa(); + helper_.ManifestUpdateDisplayMinimal("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteA_24_12SiteA_69SiteA_24_26) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayStandalone(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_31SiteA_24_12SiteA_32SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_31SiteA_24_12SiteA_48SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_31SiteA_24_12SiteA_28_70SiteA_69SiteA_94_24_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ClosePwa(); + helper_.ManifestUpdateDisplayBrowser("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckTabNotCreated(); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_31SiteA_24_12SiteA_28_36SiteA_69SiteA_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ClosePwa(); + helper_.ManifestUpdateDisplayMinimal("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_31SiteA_24_12SiteA_69SiteA_24_26) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayStandalone(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_47SiteA_24_12SiteA_32SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_47SiteA_24_12SiteA_48SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_47SiteA_24_12SiteA_28_70SiteA_69SiteA_94_24_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ClosePwa(); + helper_.ManifestUpdateDisplayBrowser("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckTabNotCreated(); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_47SiteA_24_12SiteA_28_36SiteA_69SiteA_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ClosePwa(); + helper_.ManifestUpdateDisplayMinimal("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_47SiteA_24_12SiteA_69SiteA_24_26) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayStandalone(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTest, + WebAppIntegration_29SiteA_11SiteA_51SiteA_12SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.SetOpenInWindow("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_33SiteA_12SiteA_69SiteA_24_26) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayStandalone(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_49SiteA_12SiteA_69SiteA_24_26) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckWindowDisplayStandalone(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_32SiteA_11SiteA_51SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.SetOpenInWindow("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_48SiteA_11SiteA_51SiteA_69SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.SetOpenInWindow("SiteA"); + helper_.LaunchFromMenuOption("SiteA"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteC_12SiteC_69SiteC_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteC"); + helper_.CheckAppInListWindowed("SiteC"); + helper_.LaunchFromMenuOption("SiteC"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_33SiteC_12SiteC_69SiteC_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteC"); + helper_.CheckAppInListWindowed("SiteC"); + helper_.LaunchFromMenuOption("SiteC"); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_30SiteB_69SiteB_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteB"); + helper_.LaunchFromMenuOption("SiteB"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_31SiteB_69SiteB_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteB"); + helper_.LaunchFromMenuOption("SiteB"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_33SiteB_69SiteB_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteB"); + helper_.LaunchFromMenuOption("SiteB"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_49SiteB_69SiteB_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteB"); + helper_.LaunchFromMenuOption("SiteB"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_47SiteB_69SiteB_25) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteB"); + helper_.LaunchFromMenuOption("SiteB"); + helper_.CheckWindowDisplayMinimal(); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTest, + WebAppIntegration_49SiteC_12SiteC_69SiteC_24) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteC"); + helper_.CheckAppInListWindowed("SiteC"); + helper_.LaunchFromMenuOption("SiteC"); + helper_.CheckWindowCreated(); +} + } // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/web_app_protocol_handler_intent_picker_dialog_view.cc b/chrome/browser/ui/views/web_apps/web_app_protocol_handler_intent_picker_dialog_view.cc index c54d00c..3f2de164 100644 --- a/chrome/browser/ui/views/web_apps/web_app_protocol_handler_intent_picker_dialog_view.cc +++ b/chrome/browser/ui/views/web_apps/web_app_protocol_handler_intent_picker_dialog_view.cc
@@ -9,8 +9,8 @@ #include <utility> #include "chrome/grit/generated_resources.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/strings/grit/components_strings.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/views/controls/label.h" @@ -47,7 +47,8 @@ auto open_app_label = std::make_unique<views::Label>( l10n_util::GetStringFUTF16( IDS_PROTOCOL_HANDLER_INTENT_PICKER_QUESTION, - content::ProtocolHandler::GetProtocolDisplayName(url_.scheme())), + custom_handlers::ProtocolHandler::GetProtocolDisplayName( + url_.scheme())), views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::TextStyle::STYLE_PRIMARY); open_app_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.cc b/chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.cc deleted file mode 100644 index d6d086b..0000000 --- a/chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.cc +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.h" - -#include <string> -#include <utility> - -#include "chrome/browser/ui/views/web_apps/web_app_hover_button.h" -#include "chrome/browser/web_applications/url_handler_launch_params.h" -#include "chrome/browser/web_applications/web_app_id.h" -#include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/grit/chromium_strings.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/grit/theme_resources.h" -#include "ui/accessibility/ax_enums.mojom.h" -#include "ui/accessibility/ax_node_data.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/views/controls/button/button.h" -#include "url/gurl.h" - -WebAppUrlHandlerHoverButton::WebAppUrlHandlerHoverButton( - views::Button::PressedCallback callback, - const web_app::UrlHandlerLaunchParams& url_handler_launch_params, - web_app::WebAppProvider* provider, - const std::u16string& display_name, - const GURL& app_start_url) - : WebAppHoverButton(std::move(callback), - url_handler_launch_params.app_id, - provider, - display_name, - app_start_url), - url_handler_launch_params_(url_handler_launch_params), - is_app_(true) {} - -WebAppUrlHandlerHoverButton::WebAppUrlHandlerHoverButton( - views::Button::PressedCallback callback) - : WebAppHoverButton( - std::move(callback), - *(ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( - IDR_PRODUCT_LOGO_32)), - l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)), - is_app_(false) {} - -WebAppUrlHandlerHoverButton::~WebAppUrlHandlerHoverButton() = default; - -void WebAppUrlHandlerHoverButton::GetAccessibleNodeData( - ui::AXNodeData* node_data) { - WebAppHoverButton::GetAccessibleNodeData(node_data); - node_data->role = ax::mojom::Role::kRadioButton; - const ax::mojom::CheckedState checked_state = - selected() ? ax::mojom::CheckedState::kTrue - : ax::mojom::CheckedState::kFalse; - node_data->SetCheckedState(checked_state); -} - -void WebAppUrlHandlerHoverButton::MarkAsSelected(const ui::Event* event) { - WebAppHoverButton::MarkAsSelected(event); - selected_ = true; - NotifyAccessibilityEvent(ax::mojom::Event::kStateChanged, - /*send_native_event=*/true); -} - -void WebAppUrlHandlerHoverButton::MarkAsUnselected(const ui::Event* event) { - WebAppHoverButton::MarkAsUnselected(event); - selected_ = false; - NotifyAccessibilityEvent(ax::mojom::Event::kStateChanged, - /*send_native_event=*/true); -} - -BEGIN_METADATA(WebAppUrlHandlerHoverButton, WebAppHoverButton) -END_METADATA
diff --git a/chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.h b/chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.h deleted file mode 100644 index 08feee6..0000000 --- a/chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.h +++ /dev/null
@@ -1,83 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_URL_HANDLER_HOVER_BUTTON_H_ -#define CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_URL_HANDLER_HOVER_BUTTON_H_ - -#include <string> - -#include "base/memory/weak_ptr.h" -#include "chrome/browser/ui/views/web_apps/web_app_hover_button.h" -#include "chrome/browser/web_applications/url_handler_launch_params.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/views/controls/button/button.h" -#include "ui/views/metadata/view_factory.h" - -class GURL; - -namespace web_app { -class WebAppProvider; -} - -// WebAppUrlHandlerHoverButton is a hoverable button with a primary left-hand -// icon, a title and a subtitle. -class WebAppUrlHandlerHoverButton : public WebAppHoverButton { - public: - METADATA_HEADER(WebAppUrlHandlerHoverButton); - // Creates a hoverable button with the given elements for an app, like so: - // - // +-------------------------------------------------------------------+ - // | | title | - // | icon | | - // | | subtitle | - // +-------------------------------------------------------------------+ - // - WebAppUrlHandlerHoverButton( - views::Button::PressedCallback callback, - const web_app::UrlHandlerLaunchParams& url_handler_launch_params, - web_app::WebAppProvider* provider, - const std::u16string& display_name, - const GURL& app_start_url); - - // Creates a hoverable button for the browser option, like so: - // - // +-------------------------------------------------------------------+ - // | | | - // | icon | title | - // | | | - // +-------------------------------------------------------------------+ - // - explicit WebAppUrlHandlerHoverButton(views::Button::PressedCallback callback); - WebAppUrlHandlerHoverButton(const WebAppUrlHandlerHoverButton&) = delete; - WebAppUrlHandlerHoverButton& operator=(const WebAppUrlHandlerHoverButton&) = - delete; - ~WebAppUrlHandlerHoverButton() override; - - void MarkAsSelected(const ui::Event* event) override; - void MarkAsUnselected(const ui::Event* event) override; - - const web_app::UrlHandlerLaunchParams& url_handler_launch_params() const { - return url_handler_launch_params_; - } - - bool is_app() const { return is_app_; } - bool selected() { return selected_; } - - // views::View: - void GetAccessibleNodeData(ui::AXNodeData* node_data) override; - - private: - const web_app::UrlHandlerLaunchParams url_handler_launch_params_; - // True if the current WebAppUrlHandlerHoverButton is for an app, false if - // it's for the browser. - const bool is_app_; - bool selected_ = false; -}; - -BEGIN_VIEW_BUILDER(, WebAppUrlHandlerHoverButton, WebAppHoverButton) -END_VIEW_BUILDER - -DEFINE_VIEW_BUILDER(, WebAppUrlHandlerHoverButton) - -#endif // CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_URL_HANDLER_HOVER_BUTTON_H_
diff --git a/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_browsertest.cc deleted file mode 100644 index 805fee5f..0000000 --- a/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_browsertest.cc +++ /dev/null
@@ -1,302 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/callback_helpers.h" -#include "base/containers/flat_set.h" -#include "base/files/file_path.h" -#include "base/test/bind.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/mock_callback.h" -#include "base/time/time.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_dialogs.h" -#include "chrome/browser/ui/test/test_browser_dialog.h" -#include "chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h" -#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" -#include "chrome/browser/web_applications/os_integration/url_handler_manager.h" -#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" -#include "chrome/browser/web_applications/url_handler_launch_params.h" -#include "chrome/browser/web_applications/web_app_id.h" -#include "chrome/browser/web_applications/web_app_install_info.h" -#include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "components/keep_alive_registry/keep_alive_types.h" -#include "components/keep_alive_registry/scoped_keep_alive.h" -#include "content/public/test/browser_test.h" -#include "extensions/browser/extension_dialog_auto_confirm.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/gfx/geometry/size.h" -#include "ui/views/controls/button/label_button.h" -#include "ui/views/test/dialog_test.h" -#include "ui/views/widget/any_widget_observer.h" -#include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_delegate.h" -#include "ui/views/window/dialog_delegate.h" -#include "url/gurl.h" - -namespace { - -const char16_t kAppName[] = u"Test App"; -const char kStartUrl[] = "https://test.com"; -const char kViewClassName[] = "WebAppUrlHandlerIntentPickerView"; - -std::vector<web_app::UrlHandlerLaunchParams> CreateUrlHandlerLaunchParams( - const base::FilePath& profile_path, - const web_app::AppId& app_id) { - std::vector<web_app::UrlHandlerLaunchParams> url_handler_matches; - url_handler_matches.emplace_back(profile_path, app_id, GURL(kStartUrl), - web_app::UrlHandlerSavedChoice::kNone, - base::Time::Now()); - return url_handler_matches; -} - -web_app::AppId InstallTestWebApp(Profile* profile) { - auto app_info = std::make_unique<WebAppInstallInfo>(); - app_info->start_url = GURL(kStartUrl); - app_info->title = kAppName; - app_info->user_display_mode = blink::mojom::DisplayMode::kStandalone; - return web_app::test::InstallWebApp(profile, std::move(app_info)); -} - -views::DialogDelegate* DialogDelegateFor(views::Widget* widget) { - auto* delegate = widget->widget_delegate()->AsDialogDelegate(); - return delegate; -} - -void AutoCloseDialog(views::Widget* widget) { - // Call CancelDialog to close the dialog, but the actual behavior will be - // determined by the ScopedTestDialogAutoConfirm configs. - views::test::CancelDialog(widget); -} - -} // namespace - -class WebAppUrlHandlerIntentPickerDialogInProcessBrowserTest - : public InProcessBrowserTest {}; - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInProcessBrowserTest, - ShowWebAppUrlHandlerIntentPickerDialog) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - kViewClassName); - base::HistogramTester histogram_tester; - web_app::AppId test_app_id = InstallTestWebApp(browser()->profile()); - - base::MockCallback<chrome::WebAppUrlHandlerAcceptanceCallback> - show_dialog_callback; - absl::optional<web_app::UrlHandlerLaunchParams> result_launch_params; - bool dialog_accepted; - ON_CALL(show_dialog_callback, Run) - .WillByDefault([&](bool accepted, - absl::optional<web_app::UrlHandlerLaunchParams> data) { - dialog_accepted = accepted; - result_launch_params = data; - }); - EXPECT_CALL(show_dialog_callback, Run); - - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::WEB_APP_INTENT_PICKER, KeepAliveRestartOption::DISABLED); - WebAppUrlHandlerIntentPickerView::Show( - GURL(kStartUrl), - CreateUrlHandlerLaunchParams(browser()->profile()->GetPath(), - test_app_id), - std::move(keep_alive), show_dialog_callback.Get()); - - waiter.WaitIfNeededAndGet()->CloseWithReason( - views::Widget::ClosedReason::kEscKeyPressed); - EXPECT_FALSE(dialog_accepted); - EXPECT_FALSE(result_launch_params.has_value()); - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState::kClosed, 1); -} - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInProcessBrowserTest, - OpenIsDisabledByDefault) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - kViewClassName); - base::HistogramTester histogram_tester; - web_app::AppId test_app_id = InstallTestWebApp(browser()->profile()); - - base::MockCallback<chrome::WebAppUrlHandlerAcceptanceCallback> - show_dialog_callback; - absl::optional<web_app::UrlHandlerLaunchParams> result_launch_params; - bool dialog_accepted; - ON_CALL(show_dialog_callback, Run) - .WillByDefault([&](bool accepted, - absl::optional<web_app::UrlHandlerLaunchParams> data) { - dialog_accepted = accepted; - result_launch_params = data; - }); - EXPECT_CALL(show_dialog_callback, Run); - - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::CANCEL); - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::WEB_APP_INTENT_PICKER, KeepAliveRestartOption::DISABLED); - WebAppUrlHandlerIntentPickerView::Show( - GURL(kStartUrl), - CreateUrlHandlerLaunchParams(browser()->profile()->GetPath(), - test_app_id), - std::move(keep_alive), show_dialog_callback.Get()); - - auto* widget = waiter.WaitIfNeededAndGet(); - auto* dialog_delegate = DialogDelegateFor(widget); - // Verify "Open" button is disabled by default. - EXPECT_FALSE(dialog_delegate->GetOkButton()->GetEnabled()); - AutoCloseDialog(widget); - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState::kClosed, 1); -} - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInProcessBrowserTest, - SelectBrowser) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - kViewClassName); - base::HistogramTester histogram_tester; - web_app::AppId test_app_id = InstallTestWebApp(browser()->profile()); - - base::MockCallback<chrome::WebAppUrlHandlerAcceptanceCallback> - show_dialog_callback; - absl::optional<web_app::UrlHandlerLaunchParams> result_launch_params; - bool dialog_accepted; - ON_CALL(show_dialog_callback, Run) - .WillByDefault([&](bool accepted, - absl::optional<web_app::UrlHandlerLaunchParams> data) { - dialog_accepted = accepted; - result_launch_params = data; - }); - EXPECT_CALL(show_dialog_callback, Run); - - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 0); - auto launch_params_list = CreateUrlHandlerLaunchParams( - browser()->profile()->GetPath(), test_app_id); - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::WEB_APP_INTENT_PICKER, KeepAliveRestartOption::DISABLED); - WebAppUrlHandlerIntentPickerView::Show(GURL(kStartUrl), launch_params_list, - std::move(keep_alive), - show_dialog_callback.Get()); - - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - EXPECT_TRUE(dialog_accepted); - EXPECT_FALSE(result_launch_params.has_value()); - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState:: - kBrowserAcceptedNoRememberChoice, - 1); -} - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInProcessBrowserTest, - SelectApp) { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - kViewClassName); - base::HistogramTester histogram_tester; - web_app::AppId test_app_id = InstallTestWebApp(browser()->profile()); - - base::MockCallback<chrome::WebAppUrlHandlerAcceptanceCallback> - show_dialog_callback; - absl::optional<web_app::UrlHandlerLaunchParams> result_launch_params; - bool dialog_accepted; - ON_CALL(show_dialog_callback, Run) - .WillByDefault([&](bool accepted, - absl::optional<web_app::UrlHandlerLaunchParams> data) { - dialog_accepted = accepted; - result_launch_params = data; - }); - EXPECT_CALL(show_dialog_callback, Run); - - extensions::ScopedTestDialogAutoConfirm auto_confirm( - extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION, 1); - auto launch_params_list = CreateUrlHandlerLaunchParams( - browser()->profile()->GetPath(), test_app_id); - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::WEB_APP_INTENT_PICKER, KeepAliveRestartOption::DISABLED); - WebAppUrlHandlerIntentPickerView::Show(GURL(kStartUrl), launch_params_list, - std::move(keep_alive), - show_dialog_callback.Get()); - - AutoCloseDialog(waiter.WaitIfNeededAndGet()); - // Select the second choice - the app. - EXPECT_TRUE(dialog_accepted); - EXPECT_EQ(result_launch_params, launch_params_list[0]); - histogram_tester.ExpectUniqueSample( - "WebApp.UrlHandling.DialogState", - WebAppUrlHandlerIntentPickerView::DialogState:: - kAppAcceptedNoRememberChoice, - 1); -} - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInProcessBrowserTest, - FilterOutInvalidProfiles) { - // Test valid profile path is kept. - base::FilePath current_profile_path = browser()->profile()->GetPath(); - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list = - CreateUrlHandlerLaunchParams(current_profile_path, "app id 1"); - auto valid_profiles = - WebAppUrlHandlerIntentPickerView::GetUrlHandlingValidProfiles( - launch_params_list); - EXPECT_EQ(1u, valid_profiles.size()); - EXPECT_EQ(1u, launch_params_list.size()); - EXPECT_EQ(launch_params_list.front().profile_path, current_profile_path); - - // Add an invalid profile path. - launch_params_list.emplace_back( - current_profile_path.Append(FILE_PATH_LITERAL("Nonexistent")), "app id 2", - GURL(kStartUrl), web_app::UrlHandlerSavedChoice::kNone, - base::Time::Now()); - // Verify the invalid profile is not returned. - auto new_valid_profiles = - WebAppUrlHandlerIntentPickerView::GetUrlHandlingValidProfiles( - launch_params_list); - EXPECT_EQ(1u, launch_params_list.size()); - EXPECT_EQ(1u, new_valid_profiles.size()); - EXPECT_EQ(valid_profiles, new_valid_profiles); -} - -class WebAppUrlHandlerIntentPickerDialogInteractiveBrowserTest - : public DialogBrowserTest { - public: - // DialogBrowserTest: - void ShowUi(const std::string& name) override { - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - kViewClassName); - - web_app::AppId test_app_id = InstallTestWebApp(browser()->profile()); - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::WEB_APP_INTENT_PICKER, - KeepAliveRestartOption::DISABLED); - WebAppUrlHandlerIntentPickerView::Show( - GURL(kStartUrl), - CreateUrlHandlerLaunchParams(browser()->profile()->GetPath(), - test_app_id), - std::move(keep_alive), base::DoNothing()); - if (should_close_) { - waiter.WaitIfNeededAndGet()->CloseWithReason( - views::Widget::ClosedReason::kEscKeyPressed); - } - } - - protected: - bool should_close_ = true; -}; - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInteractiveBrowserTest, - InvokeUi_CloseDialog) { - ShowAndVerifyUi(); -} - -IN_PROC_BROWSER_TEST_F(WebAppUrlHandlerIntentPickerDialogInteractiveBrowserTest, - InvokeUi_default) { - should_close_ = false; - ShowAndVerifyUi(); -}
diff --git a/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.cc b/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.cc deleted file mode 100644 index e148538..0000000 --- a/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.cc +++ /dev/null
@@ -1,463 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h" - -#include <functional> -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/barrier_closure.h" -#include "base/bind.h" -#include "base/callback.h" -#include "base/check.h" -#include "base/compiler_specific.h" -#include "base/containers/flat_set.h" -#include "base/feature_list.h" -#include "base/location.h" -#include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" -#include "base/strings/string_piece.h" -#include "base/strings/utf_string_conversions.h" -#include "base/timer/elapsed_timer.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_attributes_storage.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/profiles/profiles_state.h" -#include "chrome/browser/ui/browser_dialogs.h" -#include "chrome/browser/ui/views/chrome_layout_provider.h" -#include "chrome/browser/ui/views/web_apps/web_app_url_handler_hover_button.h" -#include "chrome/browser/web_applications/url_handler_launch_params.h" -#include "chrome/browser/web_applications/url_handler_prefs.h" -#include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/browser/web_applications/web_app_registrar.h" -#include "chrome/grit/generated_resources.h" -#include "components/keep_alive_registry/keep_alive_types.h" -#include "components/keep_alive_registry/scoped_keep_alive.h" -#include "extensions/browser/extension_dialog_auto_confirm.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/common/features.h" -#include "third_party/skia/include/core/SkColor.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/base/ui_base_types.h" -#include "ui/color/color_id.h" -#include "ui/events/event.h" -#include "ui/gfx/geometry/insets.h" -#include "ui/gfx/geometry/size.h" -#include "ui/views/accessibility/view_accessibility.h" -#include "ui/views/border.h" -#include "ui/views/controls/button/checkbox.h" -#include "ui/views/controls/scroll_view.h" -#include "ui/views/controls/separator.h" -#include "ui/views/layout/box_layout.h" -#include "ui/views/layout/box_layout_view.h" -#include "ui/views/view.h" -#include "ui/views/view_class_properties.h" -#include "ui/views/widget/widget.h" -#include "ui/views/window/dialog_delegate.h" -#include "url/gurl.h" - -namespace { - -// Maximum numbers of web apps we want to show at a time in the dialog. -// The height of the scroll in the dialog depends on how many app -// candidates we got and how many we want to show. If there is more than -// |KMaxAppResults| app candidates, we will show 3.5 apps to let the user -// know there are more than |kMaxAppResults| apps accessible by scrolling -// the list. -constexpr size_t kMaxAppResults = 3; -// This dialog follows the design that -// chrome/browser/ui/views/intent_picker_bubble_view.cc created and the -// main component sizes were also mostly copied over to share the -// same layout. -// Main components sizes -constexpr int kMaxIntentPickerWidth = 320; -constexpr int kRowHeight = 32; -constexpr int kTitlePadding = 16; -constexpr gfx::Insets kSeparatorPadding(0, 0, 16, 0); - -void RecordDialogState( - WebAppUrlHandlerIntentPickerView::DialogState dialog_state) { - base::UmaHistogramEnumeration("WebApp.UrlHandling.DialogState", dialog_state); -} - -} // namespace - -// static -base::flat_set<Profile*> -WebAppUrlHandlerIntentPickerView::GetUrlHandlingValidProfiles( - std::vector<web_app::UrlHandlerLaunchParams>& launch_params_list) { - ProfileManager* const profile_manager = g_browser_process->profile_manager(); - if (!profile_manager) - return {}; - - std::vector<Profile*> profiles; - // A predicate function for base::EraseIf that returns true if `params` - // references an invalid Profile. Otherwise, adds the corresponding profile to - // `profiles` and returns false. - // TODO(crbug.com/1217419): Verify if site permission is enabled. - auto remove_pred = [profile_manager, &profiles]( - const web_app::UrlHandlerLaunchParams& params) { - if (!profile_manager->GetProfileAttributesStorage() - .GetProfileAttributesWithPath(params.profile_path)) { - return true; // Profile deleted or path otherwise invalid. - } - - Profile* const profile = profile_manager->GetProfile(params.profile_path); - if (!profile) - return true; // Failed to load profile. - - profiles.push_back(profile); - return false; - }; - - profiles.reserve(launch_params_list.size()); - base::ElapsedTimer timer; - base::EraseIf(launch_params_list, std::move(remove_pred)); - base::UmaHistogramMicrosecondsTimes( - "WebApp.UrlHandling.GetValidProfilesAtStartUp", timer.Elapsed()); - return std::move(profiles); -} - -void WebAppUrlHandlerIntentPickerView::Show( - const GURL& url, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - std::unique_ptr<ScopedKeepAlive> keep_alive, - chrome::WebAppUrlHandlerAcceptanceCallback dialog_close_callback) { - auto view = std::make_unique<WebAppUrlHandlerIntentPickerView>( - url, std::move(launch_params_list), std::move(keep_alive), - std::move(dialog_close_callback)); - - views::DialogDelegate::CreateDialogWidget(std::move(view), - /*context=*/nullptr, - /*parent=*/nullptr) - ->Show(); -} - -WebAppUrlHandlerIntentPickerView::WebAppUrlHandlerIntentPickerView( - const GURL& url, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - std::unique_ptr<ScopedKeepAlive> keep_alive, - chrome::WebAppUrlHandlerAcceptanceCallback dialog_close_callback) - : url_(url), - launch_params_list_(std::move(launch_params_list)), - close_callback_(std::move(dialog_close_callback)), - // Pass the ScopedKeepAlive into here ensures the process is alive until - // the dialog is closed, and initiates the shutdown at closure if there - // is nothing else keeping the browser alive. - keep_alive_(std::move(keep_alive)) { - SetDefaultButton(ui::DIALOG_BUTTON_OK); - // Disable the open button by default and enable it when the user has - // selected an option. - SetButtonEnabled(ui::DIALOG_BUTTON_OK, false); - SetModalType(ui::MODAL_TYPE_NONE); - std::u16string title = - l10n_util::GetStringUTF16(IDS_URL_HANDLER_INTENT_PICKER_TITLE); - SetTitle(title); - SetShowCloseButton(true); - - SetButtonLabel( - ui::DIALOG_BUTTON_OK, - l10n_util::GetStringUTF16(IDS_URL_HANDLER_INTENT_PICKER_OK_BUTTON_TEXT)); - - SetAcceptCallback(base::BindOnce( - &WebAppUrlHandlerIntentPickerView::OnAccepted, base::Unretained(this))); - - SetCancelCallback(base::BindOnce( - &WebAppUrlHandlerIntentPickerView::OnCanceled, base::Unretained(this))); - - SetCloseCallback(base::BindOnce(&WebAppUrlHandlerIntentPickerView::OnClosed, - base::Unretained(this))); - Initialize(); -} - -WebAppUrlHandlerIntentPickerView::~WebAppUrlHandlerIntentPickerView() = default; - -gfx::Size WebAppUrlHandlerIntentPickerView::CalculatePreferredSize() const { - return gfx::Size(kMaxIntentPickerWidth, - GetHeightForWidth(kMaxIntentPickerWidth)); -} - -absl::optional<web_app::UrlHandlerLaunchParams> -WebAppUrlHandlerIntentPickerView::GetSelectedLaunchParams() const { - // User didn't make a choice, no launch params. - if (!HasUserSelectedApp()) - return absl::nullopt; - - DCHECK(IsSelectedAppValid()); - - if (hover_buttons_[selected_app_tag_.value()]->is_app()) { - return hover_buttons_[selected_app_tag_.value()] - ->url_handler_launch_params(); - } - - // User has selected the browser, no launch params. - return absl::nullopt; -} - -void WebAppUrlHandlerIntentPickerView::SetSelectedAppIndex( - size_t index, - const ui::Event& event) { - DCHECK_GE(index, 0u); - DCHECK_LT(index, hover_buttons_.size()); - if (!HasUserSelectedApp()) { - // User made a choice for the first time, enable the open button. - SetButtonEnabled(ui::DIALOG_BUTTON_OK, true); - } else { - // Unselect the previous user choice. - hover_buttons_[selected_app_tag_.value()]->MarkAsUnselected(nullptr); - } - selected_app_tag_ = index; - hover_buttons_[selected_app_tag_.value()]->MarkAsSelected(&event); - views::View::RequestFocus(); -} - -void WebAppUrlHandlerIntentPickerView::OnAccepted() { - RunCloseCallback(/*accepted=*/true); -} - -void WebAppUrlHandlerIntentPickerView::OnCanceled() { - RunCloseCallback(/*accepted=*/false); -} - -void WebAppUrlHandlerIntentPickerView::OnClosed() { - OnCanceled(); -} - -void WebAppUrlHandlerIntentPickerView::Initialize() { - auto builder = - views::Builder<WebAppUrlHandlerIntentPickerView>(this).SetLayoutManager( - std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical)); - - // size+1 for the browser entry. - size_t total_buttons = launch_params_list_.size() + 1; - hover_buttons_.reserve(total_buttons); - - // Creates a view to hold the views for each app. - auto scrollable_view_builder = - views::Builder<views::BoxLayoutView>() - .SetOrientation(views::BoxLayout::Orientation::kVertical) - .AddChildAt( - views::Builder<WebAppUrlHandlerHoverButton>( - std::make_unique< - WebAppUrlHandlerHoverButton>(base::BindRepeating( - &WebAppUrlHandlerIntentPickerView::SetSelectedAppIndex, - base::Unretained(this), 0))) - .SetTag(0) - .CustomConfigure(base::BindOnce( - [](HoverButtons& hover_buttons, int total_buttons, - WebAppUrlHandlerHoverButton* view) { - view->GetViewAccessibility().OverridePosInSet( - 1, total_buttons); - hover_buttons.push_back(view); - }, - std::ref(hover_buttons_), total_buttons)), - 0); - size_t next_button_index = 1; - - for (const auto& launch_params : launch_params_list_) { - Profile* profile = g_browser_process->profile_manager()->GetProfileByPath( - launch_params.profile_path); - web_app::WebAppProvider* const provider = - web_app::WebAppProvider::GetForWebApps(profile); - DCHECK(provider); - web_app::WebAppRegistrar& registrar = provider->registrar(); - - const std::u16string& profile_name = - profiles::GetAvatarNameForProfile(launch_params.profile_path); - const std::u16string& app_name = base::UTF8ToUTF16( - base::StringPiece(registrar.GetAppShortName(launch_params.app_id))); - const std::u16string& app_title = - (profile_name == - l10n_util::GetStringUTF16(IDS_SINGLE_PROFILE_DISPLAY_NAME)) - ? app_name - : l10n_util::GetStringFUTF16( - IDS_URL_HANDLER_INTENT_PICKER_APP_TITLE, app_name, - profile_name); - - const size_t this_button_index = next_button_index++; - // TODO(crbug.com/1072058): Make sure the UI is reasonable when - // |app_title| is long. - scrollable_view_builder.AddChildAt( - views::Builder<WebAppUrlHandlerHoverButton>( - std::make_unique<WebAppUrlHandlerHoverButton>( - base::BindRepeating( - &WebAppUrlHandlerIntentPickerView::SetSelectedAppIndex, - base::Unretained(this), this_button_index), - launch_params, provider, app_title, - registrar.GetAppStartUrl(launch_params.app_id))) - .SetTag(this_button_index) - .CustomConfigure(base::BindOnce( - [](HoverButtons& hover_buttons, size_t this_button_index, - size_t total_buttons, WebAppUrlHandlerHoverButton* view) { - view->GetViewAccessibility().OverridePosInSet( - this_button_index + 1, total_buttons); - hover_buttons.push_back(view); - }, - std::ref(hover_buttons_), this_button_index, total_buttons)), - this_button_index); - } - - builder.AddChildren( - views::Builder<views::ScrollView>() - .CopyAddressTo(&scroll_view_) - .SetBackgroundThemeColorId(ui::kColorBubbleBackground) - // This part gives the scroll a fixed width and height. The height - // depends on how many app candidates we got and how many we actually - // want to show. The added 0.5 on the else block allow us to let the - // user know there are more than |kMaxAppResults| apps accessible by - // scrolling the list. - .ClipHeightTo(kRowHeight, (kMaxAppResults + 0.5) * kRowHeight) - .CustomConfigure(base::BindOnce([](views::ScrollView* view) { - view->GetViewAccessibility().OverrideRole( - ax::mojom::Role::kRadioGroup); - })) - .SetContents(std::move(scrollable_view_builder)) - .SetProperty(views::kMarginsKey, gfx::Insets(kTitlePadding, 0, 0, 0)), - views::Builder<views::Separator>().SetBorder( - views::CreateEmptyBorder(kSeparatorPadding))); - - enable_remember_checkbox_ = - base::FeatureList::IsEnabled(blink::features::kWebAppEnableUrlHandlers); - - if (enable_remember_checkbox_) { - // The checkbox allows the user to opt-in to relaxed security (i.e. skipping - // future prompts) for this url. - builder.AddChild( - views::Builder<views::Checkbox>() - .CopyAddressTo(&remember_selection_checkbox_) - .SetText(l10n_util::GetStringUTF16( - IDS_URL_HANDLER_INTENT_PICKER_REMEMBER_SELECTION)) - // Here we use the margins key to align the position of the checkbox - // with the items in the scroll view and provide a padding space - // below. - .SetProperty(views::kMarginsKey, - gfx::Insets(0, kTitlePadding, kRowHeight, 0))); - } - std::move(builder).BuildChildren(); -} - -void WebAppUrlHandlerIntentPickerView::RunCloseCallback(bool accepted) { - if (!close_callback_) - return; - - absl::optional<web_app::UrlHandlerLaunchParams> launch_params; - bool accepted_override = false; - switch (extensions::ScopedTestDialogAutoConfirm::GetAutoConfirmValue()) { - case extensions::ScopedTestDialogAutoConfirm::NONE: - accepted_override = accepted; - launch_params = GetSelectedLaunchParams(); - break; - case extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_REMEMBER_OPTION: - remember_selection_checkbox_->SetChecked(/*checked=*/true); - [[fallthrough]]; - case extensions::ScopedTestDialogAutoConfirm::ACCEPT_AND_OPTION: - accepted_override = true; - selected_app_tag_ = - extensions::ScopedTestDialogAutoConfirm::GetOptionSelected(); - launch_params = GetSelectedLaunchParams(); - break; - case extensions::ScopedTestDialogAutoConfirm::ACCEPT: - accepted_override = true; - launch_params = GetSelectedLaunchParams(); - break; - case extensions::ScopedTestDialogAutoConfirm::CANCEL: - accepted_override = false; - launch_params = absl::nullopt; - break; - } - - auto state = DialogState::kClosed; - if (accepted_override) { - const bool remember_choice_checked = - enable_remember_checkbox_ && remember_selection_checkbox_->GetChecked(); - - if (remember_choice_checked) { - if (launch_params) { - // An app is selected as the default choice. - web_app::url_handler_prefs::SaveOpenInApp( - g_browser_process->local_state(), launch_params->app_id, - launch_params->profile_path, launch_params->url); - state = DialogState::kAppAcceptedAndRememberChoice; - } else { - // The browser is the selected default choice. - web_app::url_handler_prefs::SaveOpenInBrowser( - g_browser_process->local_state(), url_); - state = DialogState::kBrowserAcceptedAndRememberChoice; - } - } else { - state = launch_params ? DialogState::kAppAcceptedNoRememberChoice - : DialogState::kBrowserAcceptedNoRememberChoice; - } - } - RecordDialogState(state); - - std::move(close_callback_).Run(accepted_override, std::move(launch_params)); -} - -bool WebAppUrlHandlerIntentPickerView::IsSelectedAppValid() const { - return selected_app_tag_.has_value() && selected_app_tag_.value() >= 0 && - selected_app_tag_.value() < static_cast<int>(hover_buttons_.size()); -} - -bool WebAppUrlHandlerIntentPickerView::HasUserSelectedApp() const { - return selected_app_tag_.has_value(); -} - -BEGIN_METADATA(WebAppUrlHandlerIntentPickerView, views::DialogDelegateView) -END_METADATA - -namespace chrome { - -// static -void ShowWebAppUrlHandlerIntentPickerDialog( - const GURL& url, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - WebAppUrlHandlerAcceptanceCallback dialog_close_callback) { - DCHECK(dialog_close_callback); - auto keep_alive = std::make_unique<ScopedKeepAlive>( - KeepAliveOrigin::WEB_APP_INTENT_PICKER, KeepAliveRestartOption::DISABLED); - - base::flat_set<Profile*> profiles = - WebAppUrlHandlerIntentPickerView::GetUrlHandlingValidProfiles( - launch_params_list); - - auto show_dialog_callback = base::BindOnce( - [](const GURL& url, std::unique_ptr<ScopedKeepAlive> keep_alive, - base::ElapsedTimer timer, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - WebAppUrlHandlerAcceptanceCallback dialog_close_callback) { - // Record registrar loading time before showing the dialog. - base::UmaHistogramMicrosecondsTimes( - "WebApp.UrlHandling.LoadWebAppRegistrarsAtStartUp", - timer.Elapsed()); - - // TODO(crbug.com/1217419): Check if site permission is enabled once - // all profiles and registrars are loaded. - - WebAppUrlHandlerIntentPickerView::Show( - url, std::move(launch_params_list), std::move(keep_alive), - std::move(dialog_close_callback)); - }, - url, std::move(keep_alive), base::ElapsedTimer(), - std::move(launch_params_list), std::move(dialog_close_callback)); - - auto on_registrar_ready_callback = - base::BarrierClosure(profiles.size(), std::move(show_dialog_callback)); - - for (Profile* profile : profiles) { - web_app::WebAppProvider* const provider = - web_app::WebAppProvider::GetForWebApps(profile); - DCHECK(provider); - - provider->on_registry_ready().Post(FROM_HERE, on_registrar_ready_callback); - } -} - -} // namespace chrome
diff --git a/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h b/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h deleted file mode 100644 index 836791db..0000000 --- a/chrome/browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_view.h +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_URL_HANDLER_INTENT_PICKER_DIALOG_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_URL_HANDLER_INTENT_PICKER_DIALOG_VIEW_H_ - -#include <memory> -#include <vector> - -#include "base/containers/flat_set.h" -#include "chrome/browser/ui/browser_dialogs.h" -#include "chrome/browser/web_applications/url_handler_launch_params.h" -#include "components/keep_alive_registry/scoped_keep_alive.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/views/metadata/view_factory.h" -#include "ui/views/window/dialog_delegate.h" -#include "url/gurl.h" - -class Profile; -class ScopedKeepAlive; -class WebAppUrlHandlerHoverButton; - -namespace gfx { -class Size; -} - -namespace ui { -class Event; -} - -namespace views { -class Checkbox; -class ScrollView; -} // namespace views - -// The dialog's view, owned by the views framework. -// TODO(crbug.com/1209222): Dialog should be accessible. -class WebAppUrlHandlerIntentPickerView : public views::DialogDelegateView { - public: - METADATA_HEADER(WebAppUrlHandlerIntentPickerView); - - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class DialogState { - kClosed = 0, - kBrowserAcceptedAndRememberChoice = 1, - kBrowserAcceptedNoRememberChoice = 2, - kAppAcceptedAndRememberChoice = 3, - kAppAcceptedNoRememberChoice = 4, - kMaxValue = kAppAcceptedNoRememberChoice, - }; - - WebAppUrlHandlerIntentPickerView( - const GURL& url, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - std::unique_ptr<ScopedKeepAlive> keep_alive, - chrome::WebAppUrlHandlerAcceptanceCallback dialog_close_callback); - WebAppUrlHandlerIntentPickerView(const WebAppUrlHandlerIntentPickerView&) = - delete; - WebAppUrlHandlerIntentPickerView& operator=( - const WebAppUrlHandlerIntentPickerView&) = delete; - ~WebAppUrlHandlerIntentPickerView() override; - - // Returns the set of profiles referenced by `launch_params_list` (loading - // them if necessary) and removes any items in `launch_params_list` that - // reference invalid or unloadable profiles. - static base::flat_set<Profile*> GetUrlHandlingValidProfiles( - std::vector<web_app::UrlHandlerLaunchParams>& launch_params_list); - - static void Show( - const GURL& url, - std::vector<web_app::UrlHandlerLaunchParams> launch_params_list, - std::unique_ptr<ScopedKeepAlive> keep_alive, - chrome::WebAppUrlHandlerAcceptanceCallback dialog_close_callback); - - private: - using HoverButtons = std::vector<WebAppUrlHandlerHoverButton*>; - - void Initialize(); - // views::DialogDelegateView: - gfx::Size CalculatePreferredSize() const override; - - // Return the UrlHandlerLaunchParams for the selected option. Null when the - // browser is selected. - absl::optional<web_app::UrlHandlerLaunchParams> GetSelectedLaunchParams() - const; - - void OnAccepted(); - void OnCanceled(); - // Close callback called by DialogDeletegate. See - // DialogDelegate::SetCloseCallback for when it's called. - void OnClosed(); - - // Unselects the current focused app item on the list and - // refocus on the selected app item based on the index provided. - void SetSelectedAppIndex(size_t index, const ui::Event& event); - - // Runs the close_callback_ provided during Show() if it exists. - void RunCloseCallback(bool accepted); - - // Return if the |selected_app_tag_| is valid. - bool IsSelectedAppValid() const; - // Return if the user has selected an app in the dialog. - bool HasUserSelectedApp() const; - - // The URL to launch if the dialog is accepted. - const GURL url_; - const std::vector<web_app::UrlHandlerLaunchParams> launch_params_list_; - chrome::WebAppUrlHandlerAcceptanceCallback close_callback_; - std::unique_ptr<ScopedKeepAlive> keep_alive_; - - HoverButtons hover_buttons_; - // Allow the checkbox to be enabled or disabled. Enabled if the URL Handling - // feature flag is enabled, disabled otherwise. - // TODO(crbug.com/1072058): Remove when settings are implemented. - bool enable_remember_checkbox_ = false; - views::Checkbox* remember_selection_checkbox_ = nullptr; - views::ScrollView* scroll_view_ = nullptr; - - // No default selection. Not null if selected by user. - absl::optional<int> selected_app_tag_ = absl::nullopt; -}; - -BEGIN_VIEW_BUILDER(, - WebAppUrlHandlerIntentPickerView, - views::DialogDelegateView) -END_VIEW_BUILDER - -DEFINE_VIEW_BUILDER(, WebAppUrlHandlerIntentPickerView) - -#endif // CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_URL_HANDLER_INTENT_PICKER_DIALOG_VIEW_H_
diff --git a/chrome/browser/ui/views/webid/webid_dialog_views.cc b/chrome/browser/ui/views/webid/webid_dialog_views.cc deleted file mode 100644 index fea8d8e..0000000 --- a/chrome/browser/ui/views/webid/webid_dialog_views.cc +++ /dev/null
@@ -1,185 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/webid/webid_dialog_views.h" - -#include <memory> -#include "base/bind.h" -#include "base/callback.h" -#include "chrome/browser/ui/views/webid/webid_permission_view.h" -#include "chrome/browser/ui/views/webid/webid_signin_page_view.h" -#include "components/constrained_window/constrained_window_views.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/views/bubble/bubble_frame_view.h" -#include "ui/views/layout/flex_layout.h" -#include "ui/views/layout/flex_layout_types.h" -#include "ui/views/layout/layout_provider.h" -#include "ui/views/view.h" -#include "ui/views/window/dialog_delegate.h" - -// Dimensions of the dialog itself. -constexpr int kDialogMinWidth = 512; -constexpr int kDialogHeight = 450; - -WebIdDialogViews::WebIdDialogViews(content::WebContents* rp_web_contents, - CloseCallback callback) - : WebIdDialogViews(rp_web_contents, nullptr, std::move(callback)) {} - -WebIdDialogViews::WebIdDialogViews(content::WebContents* rp_web_contents, - gfx::NativeView parent, - CloseCallback callback) - : WebIdDialog(rp_web_contents), close_callback_(std::move(callback)) { - // WebIdDialogViews is a WidgetDelegate, owned by its views::Widget. It - // is destroyed by `DeleteDelegate()` which is invoked by view - // hierarchy. The below check ensures this is true. - DCHECK(owned_by_widget()); - set_parent_window(parent); -} - -WebIdDialogViews::~WebIdDialogViews() = default; - -void WebIdDialogViews::ShowInitialPermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionDialogMode mode, - PermissionCallback callback) { - state_ = State::kInitialPermission; - permission_dialog_mode_ = mode; - auto content_view = WebIdPermissionView::CreateForInitialPermission( - this, idp_hostname, rp_hostname); - permission_callback_ = std::move(callback); - SetContent(std::move(content_view)); - ShowDialog(); -} - -void WebIdDialogViews::ShowTokenExchangePermission( - const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionCallback callback) { - state_ = State::kTokenExchangePermission; - auto content_view = WebIdPermissionView::CreateForTokenExchangePermission( - this, idp_hostname, rp_hostname); - permission_callback_ = std::move(callback); - SetContent(std::move(content_view)); - ShowDialog(); -} - -void WebIdDialogViews::ShowSigninPage(content::WebContents* idp_web_contents, - const GURL& idp_signin_url) { - DCHECK(rp_web_contents()); - state_ = State::kSignIn; - - // TODO(majidvp): What happens if we are handling multiple concurrent WebId - // requests? At the moment we keep creating modal dialogs. This may be fine - // when these requests belong to different tabs but may break down if they - // are from the same tab or even share the same |initiator_web_contents| - // (e.g., two requests made from an iframe and its embedder frame). We need - // to investigate this to ensure we are providing appropriate UX. - // http://crbug.com/1141125 - auto content_view = std::make_unique<SigninPageView>( - this, rp_web_contents(), idp_web_contents, idp_signin_url); - - SetContent(std::move(content_view)); - ShowDialog(); -} - -void WebIdDialogViews::CloseSigninPage() { - DCHECK_EQ(state_, State::kSignIn); - std::move(close_callback_).Run(); - // Note that this does not close the dialog as we may want to show the token - // exchange permission still. -} - -void WebIdDialogViews::ShowDialog() { - if (dialog_) { - dialog_->Show(); - return; - } - - SetModalType(ui::MODAL_TYPE_CHILD); - SetShowCloseButton(true); - set_margins(gfx::Insets()); - - auto width = - views::LayoutProvider::Get()->GetSnappedDialogWidth(kDialogMinWidth); - set_fixed_width(width); - SetPreferredSize({width, kDialogHeight}); - - auto* layout = SetLayoutManager(std::make_unique<views::FlexLayout>()); - layout->SetOrientation(views::LayoutOrientation::kVertical) - .SetMainAxisAlignment(views::LayoutAlignment::kCenter) - .SetCrossAxisAlignment(views::LayoutAlignment::kStart); - - SetCloseCallback( - base::BindOnce(&WebIdDialogViews::OnClose, base::Unretained(this))); - - if (parent_window()) { - // To make testing easier we use the parent window if provided instead of - // showing the dialog with web contents as parent. - dialog_ = CreateBubble(this); - dialog_->Show(); - } else { - // ShowWebModalDialogViews takes ownership of this, by way of the - // DeleteDelegate method. - dialog_ = - constrained_window::ShowWebModalDialogViews(this, rp_web_contents()); - } -} - -void WebIdDialogViews::SetContent(std::unique_ptr<views::View> content) { - // TODO(majidvp): Animate the switch between old and new content views. - if (content_) - RemoveChildViewT(content_.get()); - - content_ = AddChildView(std::move(content)); -} - -void WebIdDialogViews::OnClose() { - switch (state_) { - case State::kInitialPermission: - case State::kTokenExchangePermission: - if (permission_callback_) { - // The dialog has closed without the user expressing an explicit - // preference. The current permission request should be denied. - std::move(permission_callback_).Run(UserApproval::kDenied); - } else { - // If the window dialog has closed after the permission was selected - // but before it has transitioned to State::kSignIn, there needs to - // be a close callback invocation. - std::move(close_callback_).Run(); - } - break; - case State::kSignIn: - if (close_callback_) { - // The IDP page has closed without the user completing the flow. - std::move(close_callback_).Run(); - } - break; - case State::kUninitialized: - break; - } - state_ = State::kUninitialized; -} - -bool WebIdDialogViews::Accept() { - std::move(permission_callback_).Run(UserApproval::kApproved); - // Accepting only closes the dialog once we are at token exchange state. - return permission_dialog_mode_ == PermissionDialogMode::kStateless || - state_ == State::kTokenExchangePermission; -} - -bool WebIdDialogViews::Cancel() { - std::move(permission_callback_).Run(UserApproval::kDenied); - // Cancelling always closes the dialog. - return true; -} - -BEGIN_METADATA(WebIdDialogViews, views::BubbleDialogDelegateView) -END_METADATA - -// static -WebIdDialog* WebIdDialog::Create(content::WebContents* rp_web_contents, - CloseCallback callback) { - return new WebIdDialogViews(rp_web_contents, std::move(callback)); -}
diff --git a/chrome/browser/ui/views/webid/webid_dialog_views.h b/chrome/browser/ui/views/webid/webid_dialog_views.h deleted file mode 100644 index e90c860..0000000 --- a/chrome/browser/ui/views/webid/webid_dialog_views.h +++ /dev/null
@@ -1,94 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_DIALOG_VIEWS_H_ -#define CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_DIALOG_VIEWS_H_ - -#include "base/memory/raw_ptr.h" -#include "chrome/browser/ui/webid/webid_dialog.h" -#include "content/public/browser/identity_request_dialog_controller.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/views/bubble/bubble_dialog_delegate_view.h" -#include "ui/views/view.h" -#include "ui/views/widget/widget.h" - -namespace content { -class WebContents; -} // namespace content - -// Basic bubble dialog that is used in the WebID flow. -// -// It creates a dialog and changes the content of that dialog as user moves -// through the WebID flow steps. -class WebIdDialogViews : public WebIdDialog, - public views::BubbleDialogDelegateView { - public: - METADATA_HEADER(WebIdDialogViews); - // Constructs a new dialog. The actual dialog widget will be modal to the - // |rp_web_contents| and is shown using the - // |constrained_window::ShowWebModalDialogViews| machinery. - WebIdDialogViews(content::WebContents* rp_web_contents, CloseCallback); - // Constructs a new dialog. The actual dialog widget gets to be modal to the - // |parent| window. This bypasses constrained_window machinery making - // it easier to test. - WebIdDialogViews(content::WebContents* rp_web_contents, - gfx::NativeView parent, - CloseCallback); - WebIdDialogViews(const WebIdDialogViews&) = delete; - WebIdDialogViews operator=(const WebIdDialogViews&) = delete; - ~WebIdDialogViews() override; - - void ShowInitialPermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionDialogMode mode, - PermissionCallback) override; - void ShowTokenExchangePermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionCallback) override; - void ShowSigninPage(content::WebContents* idp_web_contents, - const GURL& idp_signin_url) override; - void CloseSigninPage() override; - - private: - // Shows the dialog and creates it if necessary. - void ShowDialog(); - // Changes the content view of the dialog. - void SetContent(std::unique_ptr<views::View> content); - - void OnClose(); - bool Accept() override; - bool Cancel() override; - - enum class State { - kUninitialized, - kInitialPermission, - kSignIn, - kTokenExchangePermission - }; - // A simple state machine to keep track of where in flow we are. - State state_{State::kUninitialized}; - - PermissionCallback permission_callback_; - - // |close_callback_| is called when the dialog is closed by user action and - // |permission_callback_| is nullptr. This corresponds to a cancellation - // while no permission is being requested, in particular because the sign-in - // page has been or is being loaded. - CloseCallback close_callback_; - - // Modifies behavior based on whether the caller expects state to carry - // through multiple calls or whether the dialog should close at the end - // of a single invocation. - PermissionDialogMode permission_dialog_mode_ = - PermissionDialogMode::kStateful; - - // Dialog widget that shows the content. It is created and shown on the first - // step. It remains shown until user reaches the end of the flow or explicitly - // closes it. - raw_ptr<views::Widget> dialog_{nullptr}; - // The content that is currently shown. - raw_ptr<views::View> content_{nullptr}; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_DIALOG_VIEWS_H_
diff --git a/chrome/browser/ui/views/webid/webid_dialog_views_unittest.cc b/chrome/browser/ui/views/webid/webid_dialog_views_unittest.cc deleted file mode 100644 index cf15cc4..0000000 --- a/chrome/browser/ui/views/webid/webid_dialog_views_unittest.cc +++ /dev/null
@@ -1,243 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/webid/webid_dialog_views.h" -#include <memory> -#include "base/callback.h" -#include "base/callback_helpers.h" -#include "base/memory/raw_ptr.h" -#include "base/test/bind.h" -#include "chrome/test/base/testing_profile.h" -#include "chrome/test/views/chrome_views_test_base.h" -#include "content/public/browser/identity_request_dialog_controller.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/browser/site_instance.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/test_renderer_host.h" -#include "content/public/test/web_contents_tester.h" -#include "ui/views/test/dialog_test.h" -#include "ui/views/test/widget_test.h" -#include "ui/views/widget/widget_observer.h" - -namespace { - -const std::u16string kRpHostname = u"rp.example"; -const char* kRpUrl = "https://rp.example"; -const std::u16string kIdpHostname = u"idp.example"; -const char* kIdpUrl = "https://idp.example"; - -class DialogObserver : public views::WidgetObserver { - public: - DialogObserver() = default; - ~DialogObserver() override = default; - - void OnWidgetClosing(views::Widget* widget) override { - close_observed_ = true; - } - - bool WasWidgetClosed() { return close_observed_; } - - private: - bool close_observed_ = false; -}; - -} // namespace - -using UserApproval = content::IdentityRequestDialogController::UserApproval; -using PermissionCallback = - content::IdentityRequestDialogController::InitialApprovalCallback; -using CloseCallback = - content::IdentityRequestDialogController::IdProviderWindowClosedCallback; - -class WebIdDialogViewsTest : public ChromeViewsTestBase { - public: - void SetUp() override { - auto on_close = base::BindLambdaForTesting([&]() { did_close_ = true; }); - - ChromeViewsTestBase::SetUp(); - test_contents_ = CreateTestWebContents(GURL{kRpUrl}); - parent_widget_ = CreateTestWidget(); - dialog_ = new WebIdDialogViews(test_contents_.get(), - parent_widget_->GetNativeView(), - std::move(on_close)); - dialog_observer_ = std::make_unique<DialogObserver>(); - } - - void TearDown() override { - // Reset widget to close all windows before the final teardown. - parent_widget_.reset(); - ChromeViewsTestBase::TearDown(); - } - - std::unique_ptr<content::WebContents> CreateTestWebContents(GURL url) { - auto instance = content::SiteInstance::Create(&profile_); - // Note that we don't initialize the RenderProcessHost. If that is needed - // use `content::SiteInstance::GetProcess()->Init()`. - auto contents = content::WebContentsTester::CreateTestWebContents( - &profile_, std::move(instance)); - content::WebContentsTester::For(contents.get())->NavigateAndCommit(url); - return contents; - } - - WebIdDialogViews* dialog() const { return dialog_; } - content::WebContents* web_contents() const { return test_contents_.get(); } - DialogObserver* observer() const { return dialog_observer_.get(); } - bool did_close() const { return did_close_; } - - private: - std::unique_ptr<views::Widget> parent_widget_; - raw_ptr<WebIdDialogViews> dialog_{nullptr}; - std::unique_ptr<DialogObserver> dialog_observer_; - - bool did_close_ = false; - - // Following are all that we need to create a test web contents. - content::RenderViewHostTestEnabler test_render_host_enabler_; - TestingProfile profile_; - std::unique_ptr<content::WebContents> test_contents_; -}; - -TEST_F(WebIdDialogViewsTest, DialogButtonsState) { - // Initial permission should show two dialog buttons for OK and Cancel. - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateful, - base::DoNothing()); - EXPECT_EQ(dialog()->GetDialogButtons(), - ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - EXPECT_TRUE(dialog()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); - EXPECT_TRUE(dialog()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); - - // SignIn page should not show any buttons for OK and Cancel. - auto idp_contents = CreateTestWebContents(GURL{kIdpUrl}); - dialog()->ShowSigninPage(idp_contents.get(), GURL{kIdpUrl}); - EXPECT_EQ(dialog()->GetDialogButtons(), ui::DIALOG_BUTTON_NONE); - - // Token exchange should show two dialog buttons for OK and Cancel. - dialog()->ShowTokenExchangePermission(kRpHostname, kIdpHostname, - base::DoNothing()); - EXPECT_EQ(dialog()->GetDialogButtons(), - ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - EXPECT_TRUE(dialog()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); - EXPECT_TRUE(dialog()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); -} - -TEST_F(WebIdDialogViewsTest, ExplicitlyClosingSigninInvokesCallback) { - auto idp_contents = CreateTestWebContents(GURL{kIdpUrl}); - dialog()->ShowSigninPage(idp_contents.get(), GURL{kIdpUrl}); - EXPECT_FALSE(did_close()); - dialog()->CloseSigninPage(); - EXPECT_TRUE(did_close()); -} - -TEST_F(WebIdDialogViewsTest, ClosingDialogOnSigninInvokesCallback) { - auto idp_contents = CreateTestWebContents(GURL{kIdpUrl}); - dialog()->ShowSigninPage(idp_contents.get(), GURL{kIdpUrl}); - EXPECT_FALSE(did_close()); - dialog()->Close(); - EXPECT_TRUE(did_close()); -} - -TEST_F(WebIdDialogViewsTest, ClosingDialogOnInitialPermissionsRejectsCallback) { - UserApproval approval = UserApproval::kApproved; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateful, - on_permission_callback); - dialog()->Close(); - EXPECT_EQ(UserApproval::kDenied, approval); -} - -TEST_F(WebIdDialogViewsTest, AcceptingOnInitialPermissionsAcceptsCallback) { - UserApproval approval = UserApproval::kDenied; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateful, - on_permission_callback); - dialog()->GetWidget()->AddObserver(observer()); - dialog()->AcceptDialog(); - EXPECT_EQ(UserApproval::kApproved, approval); - EXPECT_FALSE(observer()->WasWidgetClosed()); -} - -TEST_F(WebIdDialogViewsTest, AcceptingStatelessPermissionModeClosesDialog) { - UserApproval approval = UserApproval::kDenied; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateless, - on_permission_callback); - dialog()->GetWidget()->AddObserver(observer()); - dialog()->AcceptDialog(); - EXPECT_EQ(UserApproval::kApproved, approval); - EXPECT_TRUE(observer()->WasWidgetClosed()); -} - -TEST_F(WebIdDialogViewsTest, CancellingOnInitialPermissionsRejectsCallback) { - UserApproval approval = UserApproval::kApproved; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateful, - on_permission_callback); - dialog()->CancelDialog(); - EXPECT_EQ(UserApproval::kDenied, approval); -} - -TEST_F(WebIdDialogViewsTest, InitialPermissionClosesInSinglePermissionMode) { - UserApproval approval = UserApproval::kApproved; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateless, - on_permission_callback); - dialog()->CancelDialog(); - EXPECT_EQ(UserApproval::kDenied, approval); -} - -TEST_F(WebIdDialogViewsTest, - ClosingDialogOnTokenExchangePermissionsRejectsCallback) { - UserApproval approval = UserApproval::kApproved; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowTokenExchangePermission(kRpHostname, kIdpHostname, - on_permission_callback); - dialog()->Close(); - EXPECT_EQ(UserApproval::kDenied, approval); -} - -TEST_F(WebIdDialogViewsTest, - AcceptingOnTokenExchangePermissionsAcceptsCallback) { - UserApproval approval = UserApproval::kDenied; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowTokenExchangePermission(kRpHostname, kIdpHostname, - on_permission_callback); - dialog()->AcceptDialog(); - EXPECT_EQ(UserApproval::kApproved, approval); -} - -TEST_F(WebIdDialogViewsTest, - CancellingOnTokenExchangePermissionsRejectsCallback) { - UserApproval approval = UserApproval::kApproved; - auto on_permission_callback = base::BindLambdaForTesting( - [&](UserApproval result) { approval = result; }); - dialog()->ShowInitialPermission(kRpHostname, kIdpHostname, - PermissionDialogMode::kStateful, - on_permission_callback); - dialog()->CancelDialog(); - EXPECT_EQ(UserApproval::kDenied, approval); -} - -TEST_F(WebIdDialogViewsTest, AcceptingOnTokenExchangePermissionsClosesDialog) { - dialog()->ShowTokenExchangePermission(kRpHostname, kIdpHostname, - base::DoNothing()); - - views::test::WidgetDestroyedWaiter waiter(dialog()->GetWidget()); - dialog()->AcceptDialog(); - waiter.Wait(); - // This tests will timeout if dialog widget is not destroyed so not timing out - // is success. -}
diff --git a/chrome/browser/ui/views/webid/webid_permission_view.cc b/chrome/browser/ui/views/webid/webid_permission_view.cc deleted file mode 100644 index 039dd34e..0000000 --- a/chrome/browser/ui/views/webid/webid_permission_view.cc +++ /dev/null
@@ -1,191 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/webid/webid_permission_view.h" - -#include <memory> -#include <string> - -#include "base/bind.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/ui/views/chrome_typography.h" -#include "chrome/grit/webid_resources.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/gfx/range/range.h" -#include "ui/gfx/text_constants.h" -#include "ui/views/controls/image_view.h" -#include "ui/views/controls/styled_label.h" -#include "ui/views/layout/flex_layout.h" -#include "ui/views/layout/flex_layout_types.h" -#include "ui/views/layout/layout_provider.h" -#include "ui/views/view_class_properties.h" - -// Dimensions of the dialog itself. -constexpr int kDialogMinWidth = 512; -constexpr int kDialogHeight = 400; - -// Dimension of the header. -constexpr int kHeaderHeight = 50; - -constexpr int kImageWidth = kDialogMinWidth - 120; -constexpr int kImageHeight = kDialogHeight - 200; - -std::unique_ptr<views::ImageView> CreateImage(int resource_id) { - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - auto image = std::make_unique<views::ImageView>(); - image->SetImage(rb.GetImageNamed(resource_id).AsImageSkia()); - image->SetImageSize({kImageWidth, kImageHeight}); - image->SetPreferredSize({kImageWidth, kImageHeight}); - return image; -} - -std::unique_ptr<views::View> CreateInitialMessage( - const std::u16string& idp_hostname, - const std::u16string& rp_hostname) { - auto view = std::make_unique<views::View>(); - auto* layout = view->SetLayoutManager(std::make_unique<views::FlexLayout>()); - auto insets = views::LayoutProvider::Get()->GetDialogInsetsForContentType( - views::DialogContentType::kText, views::DialogContentType::kText); - - layout->SetOrientation(views::LayoutOrientation::kVertical) - .SetMainAxisAlignment(views::LayoutAlignment::kCenter) - .SetCrossAxisAlignment(views::LayoutAlignment::kCenter) - .SetDefault(views::kMarginsKey, insets); - - view->AddChildView(CreateImage(IDR_WEBID_SIGN_IN)); - - // TODO(majidvp): Use a localized string. http://crbug.com/1141125 - std::u16string message1 = u"Sign In with $1."; - std::u16string primary_text = - base::ReplaceStringPlaceholders(message1, {idp_hostname}, nullptr); - auto primary_label = std::make_unique<views::StyledLabel>(); - primary_label->SetText(primary_text); - primary_label->SetDefaultTextStyle(views::style::STYLE_PRIMARY); - view->AddChildView(std::move(primary_label)); - - std::u16string message2 = - u"By signing in with $1,\nthey will know you visited $2."; - std::vector<std::u16string> subst; - subst.push_back(idp_hostname); - subst.push_back(rp_hostname); - - std::vector<size_t> offsets; - std::u16string secondary_text = - base::ReplaceStringPlaceholders(message2, subst, &offsets); - - views::StyledLabel::RangeStyleInfo bold_style; - bold_style.text_style = STYLE_EMPHASIZED_SECONDARY; - - auto secondary_label = std::make_unique<views::StyledLabel>(); - secondary_label->SetDefaultTextStyle(views::style::STYLE_SECONDARY); - - secondary_label->SetText(secondary_text); - secondary_label->AddStyleRange( - gfx::Range{static_cast<uint32_t>(offsets[0]), - static_cast<uint32_t>(offsets[0] + idp_hostname.length())}, - bold_style); - secondary_label->AddStyleRange( - gfx::Range{static_cast<uint32_t>(offsets[1]), - static_cast<uint32_t>(offsets[1] + rp_hostname.length())}, - bold_style); - view->AddChildView(std::move(secondary_label)); - return view; -} - -std::unique_ptr<views::View> CreateTokenExchangeMessage( - std::u16string idp_hostname, - std::u16string rp_hostname) { - auto view = std::make_unique<views::View>(); - auto* layout = view->SetLayoutManager(std::make_unique<views::FlexLayout>()); - auto insets = views::LayoutProvider::Get()->GetDialogInsetsForContentType( - views::DialogContentType::kText, views::DialogContentType::kText); - - layout->SetOrientation(views::LayoutOrientation::kVertical) - .SetMainAxisAlignment(views::LayoutAlignment::kCenter) - .SetCrossAxisAlignment(views::LayoutAlignment::kCenter) - .SetDefault(views::kMarginsKey, insets); - - view->AddChildView(CreateImage(IDR_WEBID_GLOBAL_ID_RISK)); - - // TODO(majidvp): Use a localized string. http://crbug.com/1141125 - std::u16string primary_text = - u"You might be sharing identifying information."; - - auto primary_label = std::make_unique<views::StyledLabel>(); - primary_label->SetText(primary_text); - primary_label->SetDefaultTextStyle(views::style::STYLE_PRIMARY); - view->AddChildView(std::move(primary_label)); - - std::u16string message2 = - u"$1 could use your name and email provided by\n$2 to identify or track " - u"you across the web."; - - std::vector<std::u16string> subst; - subst.push_back(rp_hostname); - subst.push_back(idp_hostname); - - std::vector<size_t> offsets; - std::u16string secondary_text = - base::ReplaceStringPlaceholders(message2, subst, &offsets); - - auto secondary_label = std::make_unique<views::StyledLabel>(); - secondary_label->SetText(secondary_text); - secondary_label->SetDefaultTextStyle(views::style::STYLE_SECONDARY); - - views::StyledLabel::RangeStyleInfo bold_style; - bold_style.text_style = STYLE_EMPHASIZED_SECONDARY; - secondary_label->AddStyleRange( - gfx::Range{static_cast<uint32_t>(offsets[0]), - static_cast<uint32_t>(offsets[0] + rp_hostname.length())}, - bold_style); - secondary_label->AddStyleRange( - gfx::Range{static_cast<uint32_t>(offsets[1]), - static_cast<uint32_t>(offsets[1] + idp_hostname.length())}, - bold_style); - view->AddChildView(std::move(secondary_label)); - return view; -} - -// static -std::unique_ptr<WebIdPermissionView> -WebIdPermissionView::CreateForInitialPermission( - WebIdDialogViews* dialog, - const std::u16string& idp_hostname, - const std::u16string& rp_hostname) { - return std::make_unique<WebIdPermissionView>( - dialog, CreateInitialMessage(idp_hostname, rp_hostname)); -} - -// static -std::unique_ptr<WebIdPermissionView> -WebIdPermissionView::CreateForTokenExchangePermission( - WebIdDialogViews* dialog, - const std::u16string& idp_hostname, - const std::u16string& rp_hostname) { - return std::make_unique<WebIdPermissionView>( - dialog, CreateTokenExchangeMessage(idp_hostname, rp_hostname)); -} - -WebIdPermissionView::WebIdPermissionView(WebIdDialogViews* dialog, - std::unique_ptr<views::View> content) { - dialog->SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); - dialog->SetButtonEnabled(ui::DIALOG_BUTTON_OK, true); - dialog->SetButtonEnabled(ui::DIALOG_BUTTON_CANCEL, true); - - // TODO(majidvp): use localized strings - dialog->SetButtonLabel(ui::DIALOG_BUTTON_OK, u"Continue"); - dialog->SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, u"Cancel"); - - auto* layout = SetLayoutManager(std::make_unique<views::FlexLayout>()); - layout->SetOrientation(views::LayoutOrientation::kVertical) - .SetMainAxisAlignment(views::LayoutAlignment::kCenter) - .SetCrossAxisAlignment(views::LayoutAlignment::kStart); - - content->SetPreferredSize({kDialogMinWidth, kDialogHeight - kHeaderHeight}); - - AddChildView(std::move(content)); -} - -WebIdPermissionView::~WebIdPermissionView() = default;
diff --git a/chrome/browser/ui/views/webid/webid_permission_view.h b/chrome/browser/ui/views/webid/webid_permission_view.h deleted file mode 100644 index f9759af..0000000 --- a/chrome/browser/ui/views/webid/webid_permission_view.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_PERMISSION_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_PERMISSION_VIEW_H_ - -#include <memory> -#include "chrome/browser/ui/views/webid/webid_dialog_views.h" -#include "ui/views/view.h" - -// Basic permission dialog that is used to ask for user approval at different -// points in the WebID flow. -// -// It shows a message with two buttons to cancel/accept e.g., -// "Would you like to do X? [Cancel] [Continue] -class WebIdPermissionView : public views::View { - public: - static std::unique_ptr<WebIdPermissionView> CreateForInitialPermission( - WebIdDialogViews* dialog, - const std::u16string& idp_hostname, - const std::u16string& rp_hostname); - static std::unique_ptr<WebIdPermissionView> CreateForTokenExchangePermission( - WebIdDialogViews* dialog, - const std::u16string& idp_hostname, - const std::u16string& rp_hostname); - - WebIdPermissionView(WebIdDialogViews* dialog, - std::unique_ptr<views::View> content); - WebIdPermissionView(const WebIdPermissionView&) = delete; - WebIdPermissionView operator=(const WebIdPermissionView&) = delete; - ~WebIdPermissionView() override; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_PERMISSION_VIEW_H_
diff --git a/chrome/browser/ui/views/webid/webid_signin_page_view.cc b/chrome/browser/ui/views/webid/webid_signin_page_view.cc deleted file mode 100644 index 31d37080..0000000 --- a/chrome/browser/ui/views/webid/webid_signin_page_view.cc +++ /dev/null
@@ -1,187 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/webid/webid_signin_page_view.h" - -#include "base/base64.h" -#include "chrome/browser/ui/webid/identity_dialog_controller.h" -#include "content/public/browser/identity_request_dialog_controller.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/web_contents.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/views/border.h" -#include "ui/views/bubble/bubble_dialog_delegate_view.h" -#include "ui/views/bubble/bubble_frame_view.h" -#include "ui/views/controls/label.h" -#include "ui/views/controls/separator.h" -#include "ui/views/controls/webview/webview.h" -#include "ui/views/layout/box_layout.h" -#include "ui/views/layout/fill_layout.h" -#include "ui/views/layout/flex_layout.h" -#include "ui/views/layout/flex_layout_types.h" -#include "ui/views/window/dialog_delegate.h" - -// Dimensions of the dialog itself. -constexpr int kDialogMinWidth = 512; -constexpr int kDialogHeight = 450; -// Dimension of the header. -constexpr int kHeaderHeight = 50; - -// Creates the following UI: -// +----------------+ -// | Page Title | -// | URL | -// +----------------+ -class TitleAndOriginView : public views::View { - public: - METADATA_HEADER(TitleAndOriginView); - TitleAndOriginView(const std::u16string& page_title, const GURL& origin) { - // The logic here is mostly based on Payments UI used for - // `PaymentHandlerWebFlowViewController`. - constexpr int kLeftPadding = 5; - auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, - gfx::Insets(0, kLeftPadding, 0, 0), 0 /* betweeen_child_spacing */)); - layout->set_minimum_cross_axis_size(kDialogMinWidth); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kStart); - - bool title_is_valid = !page_title.empty(); - if (title_is_valid) { - auto* title_label = AddChildView(std::make_unique<views::Label>( - page_title, views::style::CONTEXT_DIALOG_TITLE)); - title_label->SetFocusBehavior( - views::View::FocusBehavior::ACCESSIBLE_ONLY); - } - - // We are not showing the schema since it is expected to always be - // `https://`. - CHECK(origin.SchemeIs(url::kHttpsScheme)); - auto* origin_label = AddChildView( - std::make_unique<views::Label>(base::UTF8ToUTF16(origin.host()))); - origin_label->SetElideBehavior(gfx::ELIDE_HEAD); - if (!title_is_valid) { - // Pad to keep header as the same height as when the page title is valid. - constexpr int kVerticalPadding = 10; - origin_label->SetBorder( - views::CreateEmptyBorder(kVerticalPadding, 0, kVerticalPadding, 0)); - } - } - TitleAndOriginView(const TitleAndOriginView&) = delete; - TitleAndOriginView& operator=(const TitleAndOriginView&) = delete; - ~TitleAndOriginView() override = default; -}; - -BEGIN_METADATA(TitleAndOriginView, views::View) -END_METADATA - -// The view for IDP sign in page. -// It observes the loaded web contents to update header information as the load -// progresses and in case it navigates. -SigninPageView::SigninPageView(WebIdDialogViews* dialog, - content::WebContents* initiator_web_contents, - content::WebContents* idp_web_contents, - const GURL& provider) - : dialog_(dialog), - initiator_web_contents_(initiator_web_contents), - web_view_(nullptr) { - // Create the following UI inside parent dialog: - // +----------------+ - // | Header view | - // +--[separator]---+ - // | | - // | Content View | - // | | - // +----------------+ - // - // Currently the header view shows the title & URL using a - // `TitleAndOriginView` and content view shows the IDP sign in page using a - // `WebView`. - dialog_->SetButtons(ui::DIALOG_BUTTON_NONE); - dialog_->SetButtonEnabled(ui::DIALOG_BUTTON_OK, false); - dialog_->SetButtonEnabled(ui::DIALOG_BUTTON_CANCEL, false); - - auto* layout = SetLayoutManager(std::make_unique<views::FlexLayout>()); - layout->SetOrientation(views::LayoutOrientation::kVertical) - .SetMainAxisAlignment(views::LayoutAlignment::kCenter) - .SetCrossAxisAlignment(views::LayoutAlignment::kStart); - - header_view_ = AddChildView(CreateHeaderView()); - auto* separator = AddChildView(std::make_unique<views::Separator>()); - separator->SetPreferredSize({kDialogMinWidth, views::Separator::kThickness}); - - web_view_ = AddChildView(CreateContentWebView(idp_web_contents, provider)); - // Observe the webiew to react to URL and title changes. - Observe(web_view_->GetWebContents()); - // Update the header once after setting up the web view as it uses the URL - // and title from the web view. - UpdateHeaderView(); -} - -std::unique_ptr<views::WebView> SigninPageView::CreateContentWebView( - content::WebContents* idp_web_contents, - const GURL& provider) { - auto web_view = std::make_unique<views::WebView>( - initiator_web_contents_->GetBrowserContext()); - - web_view->SetWebContents(idp_web_contents); - - // Navigate using the WebContents directly because the WebID custom header - // is needed. - std::string header = std::string(content::kSecFedCmCsrfHeader) + ": " + - content::kSecFedCmCsrfHeaderValue; - idp_web_contents->GetController().LoadURL( - provider, content::Referrer(), ui::PAGE_TRANSITION_AUTO_TOPLEVEL, header); - - // The webview must get an explicitly set height otherwise the layout - // doesn't make it fill its container. This is likely because it has no - // content at the time of first layout (nothing has loaded yet). Because of - // this, set it to. total_dialog_height - header_height. On the other hand, - // the width will be properly set so it can be 0 here. - web_view->SetPreferredSize({kDialogMinWidth, kDialogHeight - kHeaderHeight}); - - return web_view; -} - -std::unique_ptr<views::View> SigninPageView::CreateHeaderView() { - auto header_view = std::make_unique<views::View>(); - header_view->SetLayoutManager(std::make_unique<views::FillLayout>()); - return header_view; -} - -void SigninPageView::UpdateHeaderView() { - header_view_->RemoveAllChildViews(); - header_view_->AddChildView(std::make_unique<TitleAndOriginView>( - web_view_->GetWebContents()->GetTitle(), - web_view_->GetWebContents()->GetVisibleURL().DeprecatedGetOriginAsURL())); -} - -// content::WebContentsObserver: -void SigninPageView::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - if (navigation_handle->IsSameDocument()) - return; - - UpdateHeaderView(); -} - -void SigninPageView::LoadProgressChanged(double progress) { - // Dialog view comes with a neat progressbar so we can use that to show the - // progress. - if (progress >= 1) { - // hide the progress bar - dialog_->GetBubbleFrameView()->SetProgress(absl::nullopt); - return; - } - dialog_->GetBubbleFrameView()->SetProgress(progress); -} - -void SigninPageView::TitleWasSet(content::NavigationEntry* entry) { - UpdateHeaderView(); -} - -BEGIN_METADATA(SigninPageView, views::View) -END_METADATA
diff --git a/chrome/browser/ui/views/webid/webid_signin_page_view.h b/chrome/browser/ui/views/webid/webid_signin_page_view.h deleted file mode 100644 index 313fe52..0000000 --- a/chrome/browser/ui/views/webid/webid_signin_page_view.h +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_SIGNIN_PAGE_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_SIGNIN_PAGE_VIEW_H_ - -#include <memory> - -#include "base/callback.h" -#include "base/memory/raw_ptr.h" -#include "chrome/browser/ui/views/webid/webid_dialog_views.h" -#include "content/public/browser/web_contents_observer.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/views/view.h" - -class GURL; - -namespace views { -class WebView; -} // namespace views - -// The WebIdSigninWindow loads IDP sign-in page in a modal allowing user to -// sign in. The modal may be closed by user or once IDP sign-in page has -// completed its process and have called the appropriate JS callback. -class SigninPageView : public views::View, public content::WebContentsObserver { - public: - METADATA_HEADER(SigninPageView); - SigninPageView(WebIdDialogViews* dialog, - content::WebContents* initiator_web_contents, - content::WebContents* idp_web_contents, - const GURL& provider); - ~SigninPageView() override = default; - - // content::WebContentsObserver: - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; - void LoadProgressChanged(double progress) override; - void TitleWasSet(content::NavigationEntry* entry) override; - - private: - std::unique_ptr<views::WebView> CreateContentWebView( - content::WebContents* idp_web_contents, - const GURL& provider); - std::unique_ptr<views::View> CreateHeaderView(); - - void UpdateHeaderView(); - - // The dialog that is hosting this view. - raw_ptr<WebIdDialogViews> dialog_; - - raw_ptr<content::WebContents> initiator_web_contents_; - // The header of the dialog, owned by the view hierarchy. - raw_ptr<views::View> header_view_; - // The contents of the dialog, owned by the view hierarchy. - raw_ptr<views::WebView> web_view_; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_WEBID_WEBID_SIGNIN_PAGE_VIEW_H_
diff --git a/chrome/browser/ui/webid/identity_dialog_controller.cc b/chrome/browser/ui/webid/identity_dialog_controller.cc index 372401b..69f4f13 100644 --- a/chrome/browser/ui/webid/identity_dialog_controller.cc +++ b/chrome/browser/ui/webid/identity_dialog_controller.cc
@@ -11,7 +11,6 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/ui/webid/account_selection_view.h" -#include "chrome/browser/ui/webid/webid_dialog.h" #include "components/infobars/core/infobar.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "url/gurl.h" @@ -28,84 +27,8 @@ return AccountSelectionView::GetBrandIconIdealSize(); } -void IdentityDialogController::ShowInitialPermissionDialog( - content::WebContents* rp_web_contents, - const GURL& idp_url, - content::IdentityRequestDialogController::PermissionDialogMode mode, - InitialApprovalCallback callback) { - DCHECK(!view_); - - // The WebContents should be that of RP page to make sure info bar is shown on - // the RP page. - - // TODO(majidvp): Use the provider name/url here - auto idp_hostname = - base::UTF8ToUTF16(idp_url.DeprecatedGetOriginAsURL().host()); - - auto rp_hostname = base::UTF8ToUTF16( - rp_web_contents->GetVisibleURL().DeprecatedGetOriginAsURL().host()); - - GetOrCreateView(rp_web_contents) - .ShowInitialPermission(idp_hostname, rp_hostname, mode, - std::move(callback)); -} - -void IdentityDialogController::ShowIdProviderWindow( - content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, - IdProviderWindowClosedCallback callback) { - view_closed_callback_ = std::move(callback); - - GetOrCreateView(rp_web_contents) - .ShowSigninPage(idp_web_contents, idp_signin_url); -} - -void IdentityDialogController::CloseIdProviderWindow() { - if (!view_) - return; - - // Note that this leads to the window closed callback being run. If the - // token exchange permission dialog does not need to be displayed, the - // identity request will be completed synchronously and this controller will - // be destroyed. - view_->CloseSigninPage(); - - // Do not touch local state here since |this| is now destroyed. -} - -void IdentityDialogController::ShowTokenExchangePermissionDialog( - content::WebContents* rp_web_contents, - const GURL& idp_url, - TokenExchangeApprovalCallback callback) { - auto idp_hostname = - base::UTF8ToUTF16(idp_url.DeprecatedGetOriginAsURL().host()); - - auto rp_hostname = base::UTF8ToUTF16( - rp_web_contents->GetVisibleURL().DeprecatedGetOriginAsURL().host()); - - GetOrCreateView(rp_web_contents) - .ShowTokenExchangePermission(idp_hostname, rp_hostname, - std::move(callback)); -} - -WebIdDialog& IdentityDialogController::GetOrCreateView( - content::WebContents* rp_web_contents) { - if (!view_) - view_ = WebIdDialog::Create( - rp_web_contents, base::BindOnce(&IdentityDialogController::OnViewClosed, - weak_ptr_factory_.GetWeakPtr())); - - // It is expected that we use the same rp_web_contents during the lifetime - // of this controller. - DCHECK_EQ(view_->rp_web_contents(), rp_web_contents); - - return *view_; -} - void IdentityDialogController::ShowAccountsDialog( content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_url, base::span<const content::IdentityRequestAccount> accounts, const content::IdentityProviderMetadata& idp_metadata, @@ -155,10 +78,3 @@ gfx::NativeView IdentityDialogController::GetNativeView() { return rp_web_contents_->GetNativeView(); } - -void IdentityDialogController::OnViewClosed() { - view_ = nullptr; - if (view_closed_callback_) { - std::move(view_closed_callback_).Run(); - } -}
diff --git a/chrome/browser/ui/webid/identity_dialog_controller.h b/chrome/browser/ui/webid/identity_dialog_controller.h index bab4796..98aad4a 100644 --- a/chrome/browser/ui/webid/identity_dialog_controller.h +++ b/chrome/browser/ui/webid/identity_dialog_controller.h
@@ -17,15 +17,8 @@ #include "ui/gfx/native_widget_types.h" class GURL; -class WebIdDialog; using UserApproval = content::IdentityRequestDialogController::UserApproval; -using InitialApprovalCallback = - content::IdentityRequestDialogController::InitialApprovalCallback; -using IdProviderWindowClosedCallback = - content::IdentityRequestDialogController::IdProviderWindowClosedCallback; -using TokenExchangeApprovalCallback = - content::IdentityRequestDialogController::TokenExchangeApprovalCallback; using AccountSelectionCallback = content::IdentityRequestDialogController::AccountSelectionCallback; @@ -46,15 +39,8 @@ int GetBrandIconMinimumSize() override; int GetBrandIconIdealSize() override; - void ShowInitialPermissionDialog( - content::WebContents* rp_web_contents, - const GURL& idp_url, - content::IdentityRequestDialogController::PermissionDialogMode mode, - InitialApprovalCallback) override; - void ShowAccountsDialog( content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_url, base::span<const content::IdentityRequestAccount> accounts, const content::IdentityProviderMetadata& idp_metadata, @@ -62,18 +48,6 @@ content::IdentityRequestAccount::SignInMode sign_in_mode, AccountSelectionCallback on_selected) override; - void ShowIdProviderWindow(content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, - IdProviderWindowClosedCallback) override; - - void CloseIdProviderWindow() override; - - void ShowTokenExchangePermissionDialog( - content::WebContents* rp_web_contents, - const GURL& idp_url, - TokenExchangeApprovalCallback) override; - // AccountSelectionView::Delegate: void OnAccountSelected(const Account& account) override; @@ -83,17 +57,11 @@ gfx::NativeView GetNativeView() override; private: - WebIdDialog& GetOrCreateView(content::WebContents* rp_web_contents); - raw_ptr<WebIdDialog> view_{nullptr}; - void OnViewClosed(); std::unique_ptr<AccountSelectionView> account_view_{nullptr}; AccountSelectionCallback on_account_selection_; raw_ptr<content::WebContents> rp_web_contents_; - IdProviderWindowClosedCallback view_closed_callback_; - - base::WeakPtrFactory<IdentityDialogController> weak_ptr_factory_{this}; }; #endif // CHROME_BROWSER_UI_WEBID_IDENTITY_DIALOG_CONTROLLER_H_
diff --git a/chrome/browser/ui/webid/webid_dialog.cc b/chrome/browser/ui/webid/webid_dialog.cc deleted file mode 100644 index d4b679d..0000000 --- a/chrome/browser/ui/webid/webid_dialog.cc +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webid/webid_dialog.h" - -WebIdDialog::WebIdDialog(content::WebContents* rp_web_contents) - : rp_web_contents_(rp_web_contents) {}
diff --git a/chrome/browser/ui/webid/webid_dialog.h b/chrome/browser/ui/webid/webid_dialog.h deleted file mode 100644 index 9a69b425..0000000 --- a/chrome/browser/ui/webid/webid_dialog.h +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBID_WEBID_DIALOG_H_ -#define CHROME_BROWSER_UI_WEBID_WEBID_DIALOG_H_ - -#include <string> - -#include "base/callback.h" -#include "base/memory/raw_ptr.h" -#include "content/public/browser/identity_request_dialog_controller.h" -#include "url/gurl.h" - -namespace content { -class WebContents; -} // namespace content - -using UserApproval = content::IdentityRequestDialogController::UserApproval; -using PermissionDialogMode = - content::IdentityRequestDialogController::PermissionDialogMode; -using PermissionCallback = - content::IdentityRequestDialogController::InitialApprovalCallback; -using CloseCallback = - content::IdentityRequestDialogController::IdProviderWindowClosedCallback; - -// The interface for creating and controlling a platform-dependent WebIdDialog. -class WebIdDialog { - public: - static WebIdDialog* Create(content::WebContents* rp_web_contents, - CloseCallback); - - // Creates and shows a confirmation dialog for initial permission. The - // provided callback is called with appropriate status depending on whether - // user accepted or denied/closed the dialog. - virtual void ShowInitialPermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionDialogMode mode, - PermissionCallback) = 0; - - // Creates and shows a confirmation dialog for return permission. The provided - // callback is called with appropriate status depending on whether user - // accepted or denied/closed the dialog. - virtual void ShowTokenExchangePermission(const std::u16string& idp_hostname, - const std::u16string& rp_hostname, - PermissionCallback) = 0; - - // Creates and shows a window that loads the identity provider sign in page at - // the given URL. - virtual void ShowSigninPage(content::WebContents* idp_web_contents, - const GURL& idp_signin_url) = 0; - - // Closes the sign in page. Calling the close callback that was provided - // previously. - virtual void CloseSigninPage() = 0; - - content::WebContents* rp_web_contents() const { return rp_web_contents_; } - - protected: - explicit WebIdDialog(content::WebContents* rp_web_contents); - WebIdDialog(const WebIdDialog&) = delete; - WebIdDialog& operator=(const WebIdDialog&) = delete; - virtual ~WebIdDialog() = default; - - private: - raw_ptr<content::WebContents> rp_web_contents_; -}; - -#endif // CHROME_BROWSER_UI_WEBID_WEBID_DIALOG_H_
diff --git a/chrome/browser/ui/webui/chromeos/cellular_setup/DEPS b/chrome/browser/ui/webui/chromeos/cellular_setup/DEPS deleted file mode 100644 index 55ca2bd..0000000 --- a/chrome/browser/ui/webui/chromeos/cellular_setup/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+chromeos/services/cellular_setup", -]
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 55193fad..0ce3cf22 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -15,6 +15,7 @@ #include "ash/public/cpp/esim_manager.h" #include "ash/public/cpp/network_config_service.h" #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "ash/services/multidevice_setup/multidevice_setup_service.h" #include "base/bind.h" #include "base/command_line.h" @@ -116,7 +117,6 @@ #include "chrome/grit/generated_resources.h" #include "chrome/grit/oobe_conditional_resources.h" #include "chrome/grit/oobe_unconditional_resources_map.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" // nogncheck #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h index 3a859d6..b63d832 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -10,6 +10,7 @@ #include <string> #include <vector> +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-forward.h" #include "base/memory/ref_counted.h" #include "base/observer_list.h" @@ -18,7 +19,6 @@ #include "chrome/browser/ash/login/screens/error_screen.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h" // nogncheck #include "mojo/public/cpp/bindings/pending_receiver.h" #include "ui/webui/mojo_web_ui_controller.h"
diff --git a/chrome/browser/ui/webui/chromeos/network_ui.cc b/chrome/browser/ui/webui/chromeos/network_ui.cc index 37c67fc..fe1faa51b 100644 --- a/chrome/browser/ui/webui/chromeos/network_ui.cc +++ b/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -10,6 +10,7 @@ #include "ash/public/cpp/esim_manager.h" #include "ash/public/cpp/network_config_service.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "ash/webui/network_ui/network_diagnostics_resource_provider.h" #include "ash/webui/network_ui/network_health_resource_provider.h" #include "ash/webui/network_ui/traffic_counters_resource_provider.h" @@ -42,7 +43,6 @@ #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/onc/network_onc_utils.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" #include "chromeos/services/network_health/public/mojom/network_diagnostics.mojom.h" #include "chromeos/services/network_health/public/mojom/network_health.mojom.h"
diff --git a/chrome/browser/ui/webui/chromeos/network_ui.h b/chrome/browser/ui/webui/chromeos/network_ui.h index 9319187..9f7031e 100644 --- a/chrome/browser/ui/webui/chromeos/network_ui.h +++ b/chrome/browser/ui/webui/chromeos/network_ui.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_NETWORK_UI_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_NETWORK_UI_H_ -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h" #include "chromeos/services/network_health/public/mojom/network_diagnostics.mojom-forward.h" #include "chromeos/services/network_health/public/mojom/network_health.mojom-forward.h"
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc index fcf83c6..4d714e7 100644 --- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc +++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -474,19 +474,8 @@ SkColor color_text_light = GetThemeColor(native_theme, *tp, ThemeProperties::COLOR_NTP_TEXT_LIGHT); - SkColor color_header = - GetThemeColor(native_theme, *tp, ThemeProperties::COLOR_NTP_HEADER); - // Generate a lighter color for the header gradients. - color_utils::HSL header_lighter; - color_utils::SkColorToHSL(color_header, &header_lighter); - header_lighter.l += (1 - header_lighter.l) * 0.33; - - // Generate section border color from the header color. See - // BookmarkBarView::Paint for how we do this for the bookmark bar - // borders. - SkColor color_section_border = - SkColorSetARGB(80, SkColorGetR(color_header), SkColorGetG(color_header), - SkColorGetB(color_header)); + SkColor color_section_border = GetThemeColor( + native_theme, *tp, ThemeProperties::COLOR_NTP_SECTION_BORDER); // Generate the replacements. ui::TemplateReplacements substitutions;
diff --git a/chrome/browser/ui/webui/policy/policy_ui.cc b/chrome/browser/ui/webui/policy/policy_ui.cc index b145691..2c9bc67 100644 --- a/chrome/browser/ui/webui/policy/policy_ui.cc +++ b/chrome/browser/ui/webui/policy/policy_ui.cc
@@ -49,8 +49,6 @@ {"labelPrecedence", IDS_POLICY_LABEL_PRECEDENCE}, {"labelRefreshInterval", IDS_POLICY_LABEL_REFRESH_INTERVAL}, {"labelStatus", IDS_POLICY_LABEL_STATUS}, - {"labelTimeSinceLastFetchAttempt", - IDS_POLICY_LABEL_TIME_SINCE_LAST_FETCH_ATTEMPT}, {"labelTimeSinceLastRefresh", IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH}, {"labelUsername", IDS_POLICY_LABEL_USERNAME}, {"labelManagedBy", IDS_POLICY_LABEL_MANAGED_BY},
diff --git a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc index f629b4d9..6833bf9 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
@@ -635,10 +635,8 @@ base::flat_map<std::string, std::string> status; ASSERT_TRUE(ReadStatusFor("User policies", &status)); EXPECT_EQ(status["time-since-last-refresh"], "0 secs ago"); - EXPECT_EQ(status["time-since-last-fetch-attempt"], "0 secs ago"); ASSERT_TRUE(ReadStatusFor("Device policies", &status)); EXPECT_EQ(status["time-since-last-refresh"], "0 secs ago"); - EXPECT_EQ(status["time-since-last-fetch-attempt"], "0 secs ago"); } IN_PROC_BROWSER_TEST_F(PolicyUIStatusTest, ShowsCorrectTimesSinceRefresh) { @@ -672,48 +670,8 @@ base::flat_map<std::string, std::string> status; ASSERT_TRUE(ReadStatusFor("User policies", &status)); EXPECT_EQ(status["time-since-last-refresh"], "1 hour ago"); - EXPECT_EQ(status["time-since-last-fetch-attempt"], "1 hour ago"); ASSERT_TRUE(ReadStatusFor("Device policies", &status)); EXPECT_EQ(status["time-since-last-refresh"], "1 hour ago"); - EXPECT_EQ(status["time-since-last-fetch-attempt"], "1 hour ago"); -} - -IN_PROC_BROWSER_TEST_F(PolicyUIStatusTest, - ShowsCorrectRefreshTimesAfterFailedReload) { - // Verifies that the time since refresh of a policy set is correctly updated - // after a failed attempt to update policies. - - // Mock time in policy server and classes used by refresh logic. - base::Time now = base::Time::Now(); - logged_in_user_mixin_.GetEmbeddedPolicyTestServerMixin() - ->UpdatePolicyTimestamp(now); - base::SimpleTestClock status_provider_clock_mock; - status_provider_clock_mock.SetNow(now); - auto status_provider_clock_mock_closure = - policy::PolicyStatusProvider::OverrideClockForTesting( - &status_provider_clock_mock); - base::SimpleTestClock policy_refresher_clock_mock; - policy_refresher_clock_mock.SetNow(now); - auto policy_refresher_clock_mock_closure = - policy::CloudPolicyRefreshScheduler::OverrideClockForTesting( - &policy_refresher_clock_mock); - - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), - GURL(chrome::kChromeUIPolicyURL))); - ASSERT_TRUE(ReloadPolicies()); - logged_in_user_mixin_.GetEmbeddedPolicyTestServerMixin()->SetPolicyFetchError( - 500); - status_provider_clock_mock.Advance(base::Hours(1)); - policy_refresher_clock_mock.Advance(base::Hours(1)); - ASSERT_TRUE(ReloadPolicies()); - - base::flat_map<std::string, std::string> status; - ASSERT_TRUE(ReadStatusFor("User policies", &status)); - EXPECT_EQ(status["time-since-last-refresh"], "1 hour ago"); - EXPECT_EQ(status["time-since-last-fetch-attempt"], "0 secs ago"); - ASSERT_TRUE(ReadStatusFor("Device policies", &status)); - EXPECT_EQ(status["time-since-last-refresh"], "1 hour ago"); - EXPECT_EQ(status["time-since-last-fetch-attempt"], "0 secs ago"); } #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc index cc43b2d..ed0e3555 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -485,8 +485,7 @@ ? base::Time::FromJavaTime(policy->timestamp()) : base::Time(); dict->SetStringKey("timeSinceLastRefresh", - GetTimeSinceLastActionString(last_refresh_time)); - // TODO(crbug.com/1217542): Add timeSinceLastFetchAttempt for LaCrOS. + GetTimeSinceLastRefreshString(last_refresh_time)); // TODO(https://crbug.com/1243869): Pass this information from Ash through // Mojo. Assume no error for now. @@ -597,6 +596,10 @@ const em::PolicyData* policy = policy_manager_->store()->policy(); const std::string client_id = policy ? policy->device_id() : std::string(); const std::string username = policy ? policy->username() : std::string(); + const base::Time last_refresh_time = + (policy && policy->has_timestamp()) + ? base::Time::FromJavaTime(policy->timestamp()) + : base::Time(); const std::u16string status = policy::FormatStoreStatus(policy_manager_->store()->status(), policy_manager_->store()->validation_status()); @@ -611,17 +614,8 @@ ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, ui::TimeFormat::LENGTH_SHORT, refresh_interval)); - const base::Time last_refresh_time = - (policy && policy->has_timestamp()) - ? base::Time::FromJavaTime(policy->timestamp()) - : base::Time(); dict->SetStringKey("timeSinceLastRefresh", - GetTimeSinceLastActionString(last_refresh_time)); - - const base::Time last_refresh_attempt_time = - policy_manager_->scheduler()->last_refresh_attempt(); - dict->SetStringKey("timeSinceLastFetchAttempt", - GetTimeSinceLastActionString(last_refresh_attempt_time)); + GetTimeSinceLastRefreshString(last_refresh_time)); // Check if profile is present. Note that profile is not present if object is // an instance of DeviceActiveDirectoryPolicyStatusProvider that inherits from
diff --git a/chrome/browser/ui/webui/settings/chromeos/internet_section.h b/chrome/browser/ui/webui/settings/chromeos/internet_section.h index 5e662023..3805f88 100644 --- a/chrome/browser/ui/webui/settings/chromeos/internet_section.h +++ b/chrome/browser/ui/webui/settings/chromeos/internet_section.h
@@ -59,6 +59,7 @@ void OnNetworkStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} void FetchDeviceList(); void OnGlobalPolicy(network_config::mojom::GlobalPolicyPtr global_policy);
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc index 79eebde..6d4edba 100644 --- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -10,6 +10,8 @@ #include "ash/public/cpp/bluetooth_config_service.h" #include "ash/public/cpp/esim_manager.h" #include "ash/public/cpp/network_config_service.h" +#include "ash/services/cellular_setup/cellular_setup_impl.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/nearby_sharing/contacts/nearby_share_contact_manager.h" #include "chrome/browser/nearby_sharing/nearby_receive_manager.h" @@ -28,8 +30,6 @@ #include "chrome/common/webui_url_constants.h" #include "chrome/grit/os_settings_resources.h" #include "chrome/grit/os_settings_resources_map.h" -#include "chromeos/services/cellular_setup/cellular_setup_impl.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_ui_data_source.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h index 28600c2..59a73e00 100644 --- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h +++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
@@ -7,6 +7,8 @@ #include <memory> +#include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom-forward.h" +#include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "base/time/time.h" #include "chrome/browser/ui/webui/app_management/app_management_page_handler.h" #include "chrome/browser/ui/webui/app_management/app_management_page_handler_factory.h" @@ -16,8 +18,6 @@ #include "chrome/browser/ui/webui/settings/chromeos/search/user_action_recorder.mojom-forward.h" #include "chrome/browser/ui/webui/webui_load_timer.h" #include "chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-forward.h" -#include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom-forward.h" -#include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc index c2d58be0..6880d7a 100644 --- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc +++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chrome/common/url_constants.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_ui.h" @@ -136,7 +137,7 @@ GetProtocolHandlerRegistry(); handlers_value->SetStringKey( "protocol_display_name", - content::ProtocolHandler::GetProtocolDisplayName(protocol)); + custom_handlers::ProtocolHandler::GetProtocolDisplayName(protocol)); handlers_value->SetStringKey("protocol", protocol); base::ListValue handlers_list; @@ -194,7 +195,7 @@ void ProtocolHandlersHandler::HandleRemoveHandler( const base::Value::List& args) { - ProtocolHandler handler(ParseHandlerFromArgs(args)); + custom_handlers::ProtocolHandler handler(ParseHandlerFromArgs(args)); CHECK(!handler.IsEmpty()); GetProtocolHandlerRegistry()->RemoveHandler(handler); @@ -215,19 +216,20 @@ } void ProtocolHandlersHandler::HandleSetDefault(const base::Value::List& args) { - const ProtocolHandler& handler(ParseHandlerFromArgs(args)); + const custom_handlers::ProtocolHandler& handler(ParseHandlerFromArgs(args)); CHECK(!handler.IsEmpty()); GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(handler); } -ProtocolHandler ProtocolHandlersHandler::ParseHandlerFromArgs( +custom_handlers::ProtocolHandler ProtocolHandlersHandler::ParseHandlerFromArgs( const base::Value::List& args) const { bool ok = args.size() >= 2u && args[0].is_string() && args[1].is_string(); if (!ok) - return ProtocolHandler::EmptyProtocolHandler(); + return custom_handlers::ProtocolHandler::EmptyProtocolHandler(); std::string protocol = args[0].GetString(); std::string url = args[1].GetString(); - return ProtocolHandler::CreateProtocolHandler(protocol, GURL(url)); + return custom_handlers::ProtocolHandler::CreateProtocolHandler(protocol, + GURL(url)); } custom_handlers::ProtocolHandlerRegistry* @@ -246,7 +248,7 @@ if (!handlers.empty()) { handlers_value->SetStringPath( "protocol_display_name", - content::ProtocolHandler::GetProtocolDisplayName(protocol)); + custom_handlers::ProtocolHandler::GetProtocolDisplayName(protocol)); handlers_value->SetStringPath("protocol", protocol); base::ListValue handlers_list; @@ -308,7 +310,7 @@ void ProtocolHandlersHandler::HandleRemoveAllowedAppHandler( const base::Value::List& args) { - content::ProtocolHandler handler(ParseAppHandlerFromArgs(args)); + custom_handlers::ProtocolHandler handler(ParseAppHandlerFromArgs(args)); CHECK(!handler.IsEmpty()); DCHECK(web_app_provider_); @@ -322,7 +324,7 @@ void ProtocolHandlersHandler::HandleRemoveDisallowedAppHandler( const base::Value::List& args) { - content::ProtocolHandler handler(ParseAppHandlerFromArgs(args)); + custom_handlers::ProtocolHandler handler(ParseAppHandlerFromArgs(args)); CHECK(!handler.IsEmpty()); DCHECK(web_app_provider_); @@ -339,14 +341,15 @@ // update the view then. } -content::ProtocolHandler ProtocolHandlersHandler::ParseAppHandlerFromArgs( +custom_handlers::ProtocolHandler +ProtocolHandlersHandler::ParseAppHandlerFromArgs( const base::Value::List& args) const { const std::string* protocol = args[0].GetIfString(); const std::string* url = args[1].GetIfString(); const std::string* app_id = args[2].GetIfString(); if (!protocol || !url || !app_id) - return content::ProtocolHandler::EmptyProtocolHandler(); - return content::ProtocolHandler::CreateWebAppProtocolHandler( + return custom_handlers::ProtocolHandler::EmptyProtocolHandler(); + return custom_handlers::ProtocolHandler::CreateWebAppProtocolHandler( *protocol, GURL(*url), *app_id); }
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h index eccfaf6..a7a4cc48f 100644 --- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h +++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
@@ -17,7 +17,6 @@ #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "components/custom_handlers/protocol_handler_registry.h" -#include "content/public/common/custom_handlers/protocol_handler.h" //////////////////////////////////////////////////////////////////////////////// // ProtocolHandlersHandler @@ -31,8 +30,6 @@ class DictionaryValue; } -using content::ProtocolHandler; - namespace settings { class ProtocolHandlersHandler @@ -85,7 +82,8 @@ // Parses a ProtocolHandler out of the arguments passed back from the view. // |args| is a list of [protocol, url]. - ProtocolHandler ParseHandlerFromArgs(const base::Value::List& args) const; + custom_handlers::ProtocolHandler ParseHandlerFromArgs( + const base::Value::List& args) const; // Returns a JSON object describing the set of protocol handlers for the // given protocol. @@ -115,7 +113,7 @@ // Parses an App ProtocolHandler out of |args|, which is a list of [protocol, // url, app_id]. - content::ProtocolHandler ParseAppHandlerFromArgs( + custom_handlers::ProtocolHandler ParseAppHandlerFromArgs( const base::Value::List& args) const; // Returns a DictionaryValue describing the set of app protocol handlers for
diff --git a/chrome/browser/ui/webui/version/version_ui.cc b/chrome/browser/ui/webui/version/version_ui.cc index ed92568..58253369 100644 --- a/chrome/browser/ui/webui/version/version_ui.cc +++ b/chrome/browser/ui/webui/version/version_ui.cc
@@ -177,9 +177,10 @@ html_source->AddString(version_ui::kVersion, version_info::GetVersionNumber()); #if BUILDFLAG(IS_CHROMEOS_LACROS) - // On Lacros, we don't have the concept of channels, in their usual semantics. - // Replace the channel string with "Lacros". https://crbug.com/1215734. - html_source->AddString(version_ui::kVersionModifier, "Lacros"); + // On Lacros, add channel string with "Lacros". + html_source->AddString( + version_ui::kVersionModifier, + "Lacros/" + chrome::GetChannelName(chrome::WithExtendedStable(true))); #else html_source->AddString( version_ui::kVersionModifier,
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 218e85fe..3322bf7 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -241,6 +241,7 @@ "//chrome/common", "//chrome/common:non_code_constants", "//components/content_settings/core/browser", + "//components/custom_handlers", "//components/resources:components_resources_grit", # TODO(crbug.com/1225132): Clean up this legacy crx dependency.
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.cc b/chrome/browser/web_applications/os_integration/os_integration_manager.cc index 8f4d27c..6b0a84c 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.cc +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.cc
@@ -349,36 +349,36 @@ return protocol_handler_manager_->TranslateProtocolUrl(app_id, protocol_url); } -std::vector<ProtocolHandler> OsIntegrationManager::GetHandlersForProtocol( - const std::string& protocol) { +std::vector<custom_handlers::ProtocolHandler> +OsIntegrationManager::GetHandlersForProtocol(const std::string& protocol) { if (!protocol_handler_manager_) - return std::vector<ProtocolHandler>(); + return std::vector<custom_handlers::ProtocolHandler>(); return protocol_handler_manager_->GetHandlersFor(protocol); } -std::vector<ProtocolHandler> OsIntegrationManager::GetAppProtocolHandlers( - const AppId& app_id) { +std::vector<custom_handlers::ProtocolHandler> +OsIntegrationManager::GetAppProtocolHandlers(const AppId& app_id) { if (!protocol_handler_manager_) - return std::vector<ProtocolHandler>(); + return std::vector<custom_handlers::ProtocolHandler>(); return protocol_handler_manager_->GetAppProtocolHandlers(app_id); } -std::vector<ProtocolHandler> +std::vector<custom_handlers::ProtocolHandler> OsIntegrationManager::GetAllowedHandlersForProtocol( const std::string& protocol) { if (!protocol_handler_manager_) - return std::vector<ProtocolHandler>(); + return std::vector<custom_handlers::ProtocolHandler>(); return protocol_handler_manager_->GetAllowedHandlersForProtocol(protocol); } -std::vector<ProtocolHandler> +std::vector<custom_handlers::ProtocolHandler> OsIntegrationManager::GetDisallowedHandlersForProtocol( const std::string& protocol) { if (!protocol_handler_manager_) - return std::vector<ProtocolHandler>(); + return std::vector<custom_handlers::ProtocolHandler>(); return protocol_handler_manager_->GetDisallowedHandlersForProtocol(protocol); }
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.h b/chrome/browser/web_applications/os_integration/os_integration_manager.h index c631604..6e696928 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.h +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.h
@@ -24,8 +24,8 @@ #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_install_info.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/services/app_service/public/cpp/file_handler.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "third_party/abseil-cpp/absl/types/optional.h" class Profile; @@ -46,8 +46,6 @@ // deployments. using OsHooksOptions = std::bitset<OsHookType::kMaxValue + 1>; -using content::ProtocolHandler; - // Used to pass install options configured from upstream caller. // All options are disabled by default. struct InstallOsHooksOptions { @@ -160,14 +158,14 @@ // Proxy calls for WebAppProtocolHandlerManager. virtual absl::optional<GURL> TranslateProtocolUrl(const AppId& app_id, const GURL& protocol_url); - virtual std::vector<ProtocolHandler> GetHandlersForProtocol( + virtual std::vector<custom_handlers::ProtocolHandler> GetHandlersForProtocol( const std::string& protocol); - virtual std::vector<ProtocolHandler> GetAppProtocolHandlers( + virtual std::vector<custom_handlers::ProtocolHandler> GetAppProtocolHandlers( const AppId& app_id); - virtual std::vector<ProtocolHandler> GetAllowedHandlersForProtocol( - const std::string& protocol); - virtual std::vector<ProtocolHandler> GetDisallowedHandlersForProtocol( - const std::string& protocol); + virtual std::vector<custom_handlers::ProtocolHandler> + GetAllowedHandlersForProtocol(const std::string& protocol); + virtual std::vector<custom_handlers::ProtocolHandler> + GetDisallowedHandlersForProtocol(const std::string& protocol); // Getter for testing WebAppFileHandlerManager WebAppFileHandlerManager& file_handler_manager_for_testing();
diff --git a/chrome/browser/web_applications/os_integration/protocol_handler_manager_unittest.cc b/chrome/browser/web_applications/os_integration/protocol_handler_manager_unittest.cc index adbf716..056313b9 100644 --- a/chrome/browser/web_applications/os_integration/protocol_handler_manager_unittest.cc +++ b/chrome/browser/web_applications/os_integration/protocol_handler_manager_unittest.cc
@@ -8,10 +8,10 @@ #include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_helpers.h" -#include "content/public/common/custom_handlers/protocol_handler.h" +#include "components/custom_handlers/protocol_handler.h" #include "net/base/escape.h" -using content::ProtocolHandler; +using custom_handlers::ProtocolHandler; namespace web_app {
diff --git a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc index e209cf7f..4ea0ced6 100644 --- a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc +++ b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc
@@ -12,6 +12,8 @@ #include "chrome/browser/web_applications/web_app_registrar.h" #include "third_party/blink/public/common/security/protocol_handler_security_level.h" +using custom_handlers::ProtocolHandler; + namespace web_app { WebAppProtocolHandlerManager::WebAppProtocolHandlerManager(Profile* profile)
diff --git a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h index c5a4ba3..666f853 100644 --- a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h +++ b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h
@@ -9,8 +9,8 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_id.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/services/app_service/public/cpp/protocol_handler_info.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include <vector> @@ -21,8 +21,6 @@ class WebAppRegistrar; -using content::ProtocolHandler; - class WebAppProtocolHandlerManager { public: explicit WebAppProtocolHandlerManager(Profile* profile); @@ -43,16 +41,16 @@ const GURL& protocol_url) const; // Gets the list of handlers for a given protocol. - std::vector<ProtocolHandler> GetHandlersFor( + std::vector<custom_handlers::ProtocolHandler> GetHandlersFor( const std::string& protocol) const; // Gets the list of handlers with launch permissions for a given protocol. - std::vector<ProtocolHandler> GetAllowedHandlersForProtocol( + std::vector<custom_handlers::ProtocolHandler> GetAllowedHandlersForProtocol( const std::string& protocol) const; // Gets the list of disallowed handlers for a given protocol. - std::vector<ProtocolHandler> GetDisallowedHandlersForProtocol( - const std::string& protocol) const; + std::vector<custom_handlers::ProtocolHandler> + GetDisallowedHandlersForProtocol(const std::string& protocol) const; // Gets the protocol handlers for `app_id`. Any protocols that the user // has explicitly disallowed, will be excluded. @@ -61,7 +59,7 @@ const std::string& app_id) const; // Gets all protocol handlers for |app_id| as custom handler objects. - std::vector<ProtocolHandler> GetAppProtocolHandlers( + std::vector<custom_handlers::ProtocolHandler> GetAppProtocolHandlers( const AppId& app_id) const; // Registers OS specific protocol handlers for OSs that need them, using the
diff --git a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc index 8c6d6e1..7a09b7a 100644 --- a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc +++ b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_registration_win_unittest.cc
@@ -27,8 +27,8 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/services/app_service/public/cpp/protocol_handler_info.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" @@ -41,7 +41,7 @@ const char kApp2Url[] = "https://app2.com/%s"; } // namespace -using content::ProtocolHandler; +using custom_handlers::ProtocolHandler; namespace web_app {
diff --git a/chrome/browser/web_applications/system_web_apps/README.md b/chrome/browser/web_applications/system_web_apps/README.md index 53d9eb7..f879302f 100644 --- a/chrome/browser/web_applications/system_web_apps/README.md +++ b/chrome/browser/web_applications/system_web_apps/README.md
@@ -11,7 +11,7 @@ ## Overview of a SWA A SWA is simply a Web Application, but it has access to more APIs and is distributed differently. The intent is to provide an extended platform of Web Apps to make them suitable for sensitive and internal applications. -We have a sample system web application to test out new platform features as well as to demonstrate how to build a basic SWA. For reference see: [the code](https://osscs.corp.google.com/chromium/chromium/src/+/master:chrome/browser/chromeos/web_applications/sample_system_web_app_info.h) and [the initial checkin](https://chromium-review.googlesource.com/c/chromium/src/+/1956978) +We have a sample system web application to test out new platform features as well as to demonstrate how to build a basic SWA. For reference see: [the code](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/web_applications/sample_system_web_app_info.h) and [the initial checkin](https://chromium-review.googlesource.com/c/chromium/src/+/1956978) ## Distribution System Web Apps are distributed with the OS image. For most apps, icons, js and html are all packaged with GRIT. C++ code is compiled into the OS. This means that there is no versioning mismatch possible between ChromeOS and an SWA, or from the C++ part of an SWA to the web part. This distribution also implies that releases and bug fixes are tied to the ChromeOS release schedule.
diff --git a/chrome/browser/web_applications/test/web_app_install_test_utils.cc b/chrome/browser/web_applications/test/web_app_install_test_utils.cc index 0c4a4442..2641900 100644 --- a/chrome/browser/web_applications/test/web_app_install_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_install_test_utils.cc
@@ -22,13 +22,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" -#include "chrome/browser/web_applications/os_integration/url_handler_manager.h" -#include "components/services/app_service/public/cpp/url_handler_info.h" -#endif - namespace web_app { namespace test { @@ -114,39 +107,6 @@ return app_id; } -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -AppId InstallWebAppWithUrlHandlers( - Profile* profile, - const GURL& start_url, - const std::u16string& app_name, - const std::vector<apps::UrlHandlerInfo>& url_handlers) { - std::unique_ptr<WebAppInstallInfo> info = - std::make_unique<WebAppInstallInfo>(); - info->start_url = start_url; - info->title = app_name; - info->user_display_mode = DisplayMode::kStandalone; - info->url_handlers = url_handlers; - web_app::AppId app_id = - web_app::test::InstallWebApp(profile, std::move(info)); - - auto& url_handler_manager = WebAppProvider::GetForTest(profile) - ->os_integration_manager() - .url_handler_manager_for_testing(); - - base::RunLoop run_loop; - url_handler_manager.RegisterUrlHandlers( - app_id, base::BindLambdaForTesting([&](Result result) { - EXPECT_EQ(Result::kOk, result); - run_loop.Quit(); - })); - run_loop.Run(); - // Allow updates to be published to App Service listeners. - base::RunLoop().RunUntilIdle(); - return app_id; -} -#endif - void UninstallWebApp(Profile* profile, const AppId& app_id) { WebAppProvider* const provider = WebAppProvider::GetForTest(profile); base::RunLoop run_loop;
diff --git a/chrome/browser/web_applications/test/web_app_install_test_utils.h b/chrome/browser/web_applications/test/web_app_install_test_utils.h index b27bf82..1e26d9d 100644 --- a/chrome/browser/web_applications/test/web_app_install_test_utils.h +++ b/chrome/browser/web_applications/test/web_app_install_test_utils.h
@@ -50,18 +50,6 @@ webapps::WebappInstallSource install_source = webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON); -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -// Install a web app with url_handlers then register it with the -// UrlHandlerManager. This is sufficient for testing URL matching and launch -// at startup. -AppId InstallWebAppWithUrlHandlers( - Profile* profile, - const GURL& start_url, - const std::u16string& app_name, - const std::vector<apps::UrlHandlerInfo>& url_handlers); -#endif - // Synchronously uninstall a web app. May be used in unit tests and browser // tests. void UninstallWebApp(Profile* profile, const AppId& app_id);
diff --git a/chrome/browser/web_applications/web_app_utils.cc b/chrome/browser/web_applications/web_app_utils.cc index e60973b3..9d92a38 100644 --- a/chrome/browser/web_applications/web_app_utils.cc +++ b/chrome/browser/web_applications/web_app_utils.cc
@@ -342,8 +342,9 @@ OsIntegrationManager& os_integration_manager = provider->os_integration_manager(); - const std::vector<ProtocolHandler> original_protocol_handlers = - os_integration_manager.GetAppProtocolHandlers(app_id); + const std::vector<custom_handlers::ProtocolHandler> + original_protocol_handlers = + os_integration_manager.GetAppProtocolHandlers(app_id); if (allowed) { provider->sync_bridge().AddAllowedLaunchProtocol(app_id,
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index bc02490..341d4c3 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1646222096-ccb9bee184e3fdb139b29bc9adba34557730e930.profdata +chrome-linux-main-1646243962-7b7500a9d762e0521acc4b122a90a18fe81dc05a.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 150c196..80a538d 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1646222096-ac164ee129b6861080ba0eb39f56b00fc2d72824.profdata +chrome-mac-arm-main-1646243962-4e46f239b2896d5d1f8a30282562dc33c882f1c3.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 48447b2..592168d 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1646222096-f115dfd7ea61df36905b377c9d6589bf1cd7e304.profdata +chrome-mac-main-1646243962-70daee8a5bf56a806e3330535829c6bcc69e440f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 6c8dc6c..c832188 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1646222096-df5c1b637498bb3cbdf3bd8f350ca0c716a89e86.profdata +chrome-win32-main-1646243962-4f6458fc9bad2f39414b2dcd5d75951912983f24.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 8c4d406..b6c7adc 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1646222096-73a6a0b463edb45f6045bb3da7f8702bc129bf08.profdata +chrome-win64-main-1646243962-bed2ea6ef9147ee706d4a29a46c4724fb3b1b7a7.profdata
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc index 9d66b77..b064c41 100644 --- a/chrome/common/chrome_content_client.cc +++ b/chrome/common/chrome_content_client.cc
@@ -424,12 +424,3 @@ }), io_task_runner); } - -std::u16string ChromeContentClient::GetLocalizedProtocolName( - const std::string& protocol) { - if (protocol == "mailto") - return GetLocalizedString(IDS_REGISTER_PROTOCOL_HANDLER_MAILTO_NAME); - if (protocol == "webcal") - return GetLocalizedString(IDS_REGISTER_PROTOCOL_HANDLER_WEBCAL_NAME); - return ContentClient::GetLocalizedProtocolName(protocol); -}
diff --git a/chrome/common/chrome_content_client.h b/chrome/common/chrome_content_client.h index 77a7c208..1aafffa 100644 --- a/chrome/common/chrome_content_client.h +++ b/chrome/common/chrome_content_client.h
@@ -88,7 +88,6 @@ std::u16string GetLocalizedString(int message_id) override; std::u16string GetLocalizedString(int message_id, const std::u16string& replacement) override; - std::u16string GetLocalizedProtocolName(const std::string& protocol) override; base::StringPiece GetDataResource( int resource_id, ui::ResourceScaleFactor scale_factor) override;
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl index a24e78a..5a53def 100644 --- a/chrome/common/extensions/api/autotest_private.idl +++ b/chrome/common/extensions/api/autotest_private.idl
@@ -255,6 +255,8 @@ callback IsArcPackageListInitialRefreshedCallback = void (boolean refreshed); + callback IsLacrosPrimaryBrowserCallback = void (boolean primary); + dictionary ArcAppDict { DOMString name; DOMString packageName; @@ -728,6 +730,13 @@ [supportsPromises] static void isArcProvisioned( IsArcProvisionedCallback callback); + // Returns true if Lacros is the primary browser. This includes the case + // where Lacros is the only browser. + // NOTE: Because the answer depends on the policy, this function should + // be used only after profile initialization. + [supportsPromises] static void isLacrosPrimaryBrowser( + IsLacrosPrimaryBrowserCallback callback); + // Gets information about the requested ARC app. [supportsPromises] static void getArcApp(DOMString appId, GetArcAppCallback callback);
diff --git a/chrome/services/sharing/nearby/platform/wifi_lan_medium_unittest.cc b/chrome/services/sharing/nearby/platform/wifi_lan_medium_unittest.cc index 2dbf980..8eec593 100644 --- a/chrome/services/sharing/nearby/platform/wifi_lan_medium_unittest.cc +++ b/chrome/services/sharing/nearby/platform/wifi_lan_medium_unittest.cc
@@ -137,6 +137,7 @@ void TearDown() override { wifi_lan_medium_.reset(); + cros_network_config_helper_.reset(); managed_network_config_handler_.reset(); ui_proxy_config_service_.reset(); network_configuration_handler_.reset(); @@ -199,15 +200,19 @@ protected: // Boiler plate to set up a test CrosNetworkConfig mojo service. void InitializeCrosNetworkConfig(bool use_managed_config_handler) { + cros_network_config_helper_ = + std::make_unique<chromeos::network_config::CrosNetworkConfigTestHelper>( + /*initialize=*/false); + if (use_managed_config_handler) { network_profile_handler_ = chromeos::NetworkProfileHandler::InitializeForTesting(); network_configuration_handler_ = chromeos::NetworkConfigurationHandler::InitializeForTest( - cros_network_config_helper_.network_state_helper() + cros_network_config_helper_->network_state_helper() .network_state_handler(), - cros_network_config_helper_.network_device_handler()); + cros_network_config_helper_->network_device_handler()); PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry()); PrefProxyConfigTrackerImpl::RegisterPrefs(local_state_.registry()); @@ -217,16 +222,16 @@ ui_proxy_config_service_ = std::make_unique<chromeos::UIProxyConfigService>( &user_prefs_, &local_state_, - cros_network_config_helper_.network_state_helper() + cros_network_config_helper_->network_state_helper() .network_state_handler(), network_profile_handler_.get()); managed_network_config_handler_ = chromeos::ManagedNetworkConfigurationHandler::InitializeForTesting( - cros_network_config_helper_.network_state_helper() + cros_network_config_helper_->network_state_helper() .network_state_handler(), network_profile_handler_.get(), - cros_network_config_helper_.network_device_handler(), + cros_network_config_helper_->network_device_handler(), network_configuration_handler_.get(), ui_proxy_config_service_.get()); managed_network_config_handler_->SetPolicy( @@ -238,10 +243,10 @@ base::RunLoop().RunUntilIdle(); } - cros_network_config_helper_.Initialize( + cros_network_config_helper_->Initialize( managed_network_config_handler_.get()); - cros_network_config_helper_.network_state_helper().ClearDevices(); - cros_network_config_helper_.network_state_helper().ClearServices(); + cros_network_config_helper_->network_state_helper().ClearDevices(); + cros_network_config_helper_->network_state_helper().ClearServices(); chromeos::network_config::BindToInProcessInstance( cros_network_config_.BindNewPipeAndPassReceiver()); @@ -254,13 +259,13 @@ base::DictionaryValue ipv4; ipv4.SetKey(shill::kAddressProperty, base::Value(local_addr.ToString())); ipv4.SetKey(shill::kMethodProperty, base::Value(shill::kTypeIPv4)); - cros_network_config_helper_.network_state_helper() + cros_network_config_helper_->network_state_helper() .ip_config_test() ->AddIPConfig(kIPv4ConfigPath, ipv4); base::RunLoop().RunUntilIdle(); } - cros_network_config_helper_.network_state_helper() + cros_network_config_helper_->network_state_helper() .service_test() ->AddServiceWithIPConfig(kWifiServicePath, kWifiGuid, kWifiServiceName, shill::kTypeWifi, shill::kStateOnline, @@ -317,8 +322,8 @@ std::unique_ptr<chromeos::UIProxyConfigService> ui_proxy_config_service_; std::unique_ptr<chromeos::ManagedNetworkConfigurationHandler> managed_network_config_handler_; - chromeos::network_config::CrosNetworkConfigTestHelper - cros_network_config_helper_{/*initialize=*/false}; + std::unique_ptr<chromeos::network_config::CrosNetworkConfigTestHelper> + cros_network_config_helper_; mojo::SharedRemote<chromeos::network_config::mojom::CrosNetworkConfig> cros_network_config_;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 61b80ac..e9edb2d 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1310,7 +1310,6 @@ "//components/security_interstitials/content:security_interstitial_page", "//components/security_interstitials/core:unsafe_resource", "//components/security_state/content", - "//components/services/app_service/public/cpp:app_url_handling", "//components/services/app_service/public/cpp:protocol_handling", "//components/services/app_service/public/mojom", "//components/services/language_detection/public/cpp", @@ -2436,13 +2435,6 @@ data_deps += [ "//chrome:packed_resources" ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { - sources += [ - "../browser/ui/startup/web_app_url_handling_startup_test_utils.cc", - "../browser/ui/startup/web_app_url_handling_startup_test_utils.h", - ] - } - if (enable_soda) { sources += [ "../browser/speech/speech_recognition_service_browsertest.cc" ] @@ -3288,6 +3280,7 @@ "../browser/apps/platform_apps/app_window_interactive_uitest_base.h", "../browser/ash/accessibility/accessibility_common_browsertest.cc", "../browser/ash/accessibility/accessibility_extension_api_browsertest.cc", + "../browser/ash/accessibility/accessibility_extension_channel_browsertest.cc", "../browser/ash/accessibility/accessibility_manager_browsertest.cc", "../browser/ash/accessibility/accessibility_test_utils.cc", "../browser/ash/accessibility/accessibility_test_utils.h", @@ -4215,7 +4208,6 @@ sources += [ "../browser/ui/views/profiles/profile_picker_view_browsertest.cc", "../browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc", - "../browser/ui/views/web_apps/web_app_url_handler_intent_picker_dialog_browsertest.cc", ] } @@ -4336,7 +4328,6 @@ "../browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h", "../browser/lacros/browser_test_util.cc", "../browser/lacros/browser_test_util.h", - "../browser/lacros/cert_db_initializer_browsertest.cc", "../browser/lacros/device_attributes_lacros_browsertest.cc", # download_controller_client_lacros_browsertest.cc should become a unit @@ -4387,6 +4378,7 @@ "../browser/lacros/browser_service_lacros_browsertest.cc", "../browser/lacros/browser_test_util.cc", "../browser/lacros/browser_test_util.h", + "../browser/lacros/cert_db_initializer_browsertest.cc", "../browser/lacros/clipboard_lacros_browsertest.cc", "../browser/lacros/crosapi_pref_observer_lacros_browsertest.cc", "../browser/lacros/holding_space_service_lacros_browsertest.cc", @@ -4422,6 +4414,7 @@ "//chrome/app:command_ids", "//chrome/browser/metrics/structured", "//chrome/browser/web_applications:web_applications_test_support", + "//chromeos/crosapi/cpp:cpp", "//chromeos/crosapi/mojom", "//chromeos/lacros", "//chromeos/lacros:test_support", @@ -8122,7 +8115,6 @@ "../browser/ui/views/user_education/help_bubble_view_unittest.cc", "../browser/ui/views/user_education/new_badge_label_unittest.cc", "../browser/ui/views/user_education/tip_marquee_view_unittest.cc", - "../browser/ui/views/webid/webid_dialog_views_unittest.cc", "../browser/ui/window_name_prompt/window_name_prompt_unittest.cc", ] if (is_linux) {
diff --git a/chrome/test/chromeos/autotest/files/client/deps/chrome_test/chrome_test.py b/chrome/test/chromeos/autotest/files/client/deps/chrome_test/chrome_test.py index 3d3826d7..09dbff1 100755 --- a/chrome/test/chromeos/autotest/files/client/deps/chrome_test/chrome_test.py +++ b/chrome/test/chromeos/autotest/files/client/deps/chrome_test/chrome_test.py
@@ -1,10 +1,10 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2010 The Chromium OS 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 common, commands, logging, os +import common, os from autotest_lib.client.bin import utils version = 1
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js index e63823d..3178dfbf 100644 --- a/chrome/test/data/extensions/api_test/autotest_private/test.js +++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -1136,6 +1136,13 @@ }); }, + function isLacrosPrimaryBrowser() { + chrome.autotestPrivate.isLacrosPrimaryBrowser( + chrome.test.callbackPass(function(primary) { + chrome.test.assertTrue(typeof primary === 'boolean'); + })); + }, + // KEEP |lockScreen()| TESTS AT THE BOTTOM OF THE defaultTests AS IT WILL // CHANGE THE SESSION STATE TO LOCKED STATE. function lockScreen() {
diff --git a/chrome/test/data/pdf/gesture_detector_test.js b/chrome/test/data/pdf/gesture_detector_test.js index cbc0419..fcef476 100644 --- a/chrome/test/data/pdf/gesture_detector_test.js +++ b/chrome/test/data/pdf/gesture_detector_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {GestureDetector, PinchEventDetail} from 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js'; +import {GestureDetector} from 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js'; import {createWheelEvent} from './test_util.js'; chrome.test.runTests(function() {
diff --git a/chrome/test/data/pdf/metrics_test.js b/chrome/test/data/pdf/metrics_test.js index 814175e..4fc57ab6 100644 --- a/chrome/test/data/pdf/metrics_test.js +++ b/chrome/test/data/pdf/metrics_test.js
@@ -43,10 +43,13 @@ resetForTesting(); chrome.metricsPrivate = new MockMetricsPrivate(); - const keys = Object.keys(UserAction).filter(key => { - return key !== 'DOCUMENT_OPENED' && key !== 'NUMBER_OF_ACTIONS' && - !key.endsWith('_FIRST'); - }); + const keys = Object.keys(UserAction) + .filter(key => Number.isInteger(UserAction[key])) + .filter(key => { + return key !== 'DOCUMENT_OPENED' && + key !== 'NUMBER_OF_ACTIONS' && + !key.endsWith('_FIRST'); + }); for (const key of keys) { const firstKey = `${key}_FIRST`;
diff --git a/chrome/test/data/pdf/viewport_scroller_test.js b/chrome/test/data/pdf/viewport_scroller_test.js index ba380b5..715bd2ea 100644 --- a/chrome/test/data/pdf/viewport_scroller_test.js +++ b/chrome/test/data/pdf/viewport_scroller_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {Point, ViewportScroller} from 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js'; +import {ViewportScroller} from 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js'; import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.m.js'; class FakePlugin extends EventTarget {
diff --git a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js index 241c52a8..3348dfc0 100644 --- a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js +++ b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
@@ -398,6 +398,11 @@ this.observers_.forEach(o => o.onNetworkStateChanged(networkState)); } + /** @param {string} userhash */ + onPoliciesApplied(userhash) { + this.observers_.forEach(o => o.onPoliciesApplied(userhash)); + } + onDeviceStateListChanged() { this.observers_.forEach(o => o.onDeviceStateListChanged()); } @@ -619,6 +624,7 @@ /** @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy */ setGlobalPolicy(globalPolicy) { this.globalPolicy_ = globalPolicy; + this.onPoliciesApplied(/*userhash=*/ ''); } /**
diff --git a/chrome/test/data/webui/settings/chromeos/internet_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_page_tests.js index 2199c58..4f0edfe2 100644 --- a/chrome/test/data/webui/settings/chromeos/internet_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/internet_page_tests.js
@@ -689,32 +689,28 @@ assertTrue(!!internetDetailMenu); }); - test('Update global policy when network state changed', async function() { - await navigateToCellularDetailPage(); + test( + 'Update global policy when triggering OnPoliciesApplied()', + async function() { + await navigateToCellularDetailPage(); - const detailPage = internetPage.$$('settings-internet-detail-page'); - assertTrue(!!detailPage); - assertTrue(!!detailPage.globalPolicy); - assertFalse(detailPage.globalPolicy.allow_only_policy_cellular_networks); + const detailPage = internetPage.$$('settings-internet-detail-page'); + assertTrue(!!detailPage); + assertTrue(!!detailPage.globalPolicy); + assertFalse( + detailPage.globalPolicy.allow_only_policy_cellular_networks); - // Set global policy and update a eSIM network. - const globalPolicy = { - allow_only_policy_cellular_networks: true, - }; - mojoApi_.setGlobalPolicy(globalPolicy); + // Set global policy should also update the global policy + const globalPolicy = { + allow_only_policy_cellular_networks: true, + }; + mojoApi_.setGlobalPolicy(globalPolicy); + await flushAsync(); - // Modify same guid networkState should fire onNetworkStateChanged() - const mojom = chromeos.networkConfig.mojom; - const eSimNetwork = OncMojo.getDefaultManagedProperties( - mojom.NetworkType.kCellular, 'cellular1', 'name1'); - eSimNetwork.connectionState = mojom.ConnectionStateType.kNotConnected; - mojoApi_.setManagedPropertiesForTest(eSimNetwork); - await flushAsync(); - - assertTrue(!!detailPage); - assertTrue(!!detailPage.globalPolicy); - assertTrue(detailPage.globalPolicy.allow_only_policy_cellular_networks); - }); + assertTrue(!!detailPage); + assertTrue(!!detailPage.globalPolicy); + assertTrue(detailPage.globalPolicy.allow_only_policy_cellular_networks); + }); // TODO(stevenjb): Figure out a way to reliably test navigation. Currently // such tests are flaky.
diff --git a/chrome/test/data/webui/test_util.js b/chrome/test/data/webui/test_util.js index 37b2a6f..38e63d3f 100644 --- a/chrome/test/data/webui/test_util.js +++ b/chrome/test/data/webui/test_util.js
@@ -128,7 +128,7 @@ // Promises have microtask timing, so we use setTimeout to explicitly force // a new task. return new Promise(function(resolve, reject) { - window.setTimeout(resolve, 0); + window.setTimeout(resolve, 1); }); }
diff --git a/chrome/test/enterprise/e2e/.vpython b/chrome/test/enterprise/e2e/.vpython deleted file mode 100644 index bc98d89f..0000000 --- a/chrome/test/enterprise/e2e/.vpython +++ /dev/null
@@ -1,105 +0,0 @@ -# This file defines all the extra packages we need to install to run the python -# scripts in our repo and is used in LUCI to create reproducible bubbles in -# which to run our ./test.py script. -# -# You can also use this locally by invoking `vpython` instead of `python` when -# running the test scripts. -# -# More information: -# https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md -python_version: "2.7" - -wheel: < - name: "infra/celab/celab/windows-amd64" - # Source: https://ci.chromium.org/p/celab/builders/ci/Windows/b8839159667690916800 - version: "ESovjdrWROIDnSgn5pI9YH26d43O2_iYLvqCFSAZ7u0C" -> - -# googleapiclient -wheel: < - name: "infra/python/wheels/google_api_python_client-py2_py3" - version: "version:1.6.2" -> - -# googleapiclient's dependencies -wheel: < - name: "infra/python/wheels/httplib2-py2_py3" - version: "version:0.10.3" -> -wheel: < - name: "infra/python/wheels/oauth2client-py2_py3" - version: "version:4.1.3" -> -wheel: < - name: "infra/python/wheels/pyasn1-py2_py3" - version: "version:0.2.3" -> -wheel: < - name: "infra/python/wheels/pyasn1_modules-py2_py3" - version: "version:0.0.8" -> -wheel: < - name: "infra/python/wheels/rsa-py2_py3" - version: "version:3.4.2" -> -wheel: < - name: "infra/python/wheels/six-py2_py3" - version: "version:1.10.0" -> -wheel: < - name: "infra/python/wheels/uritemplate-py2_py3" - version: "version:3.0.0" -> - -# google.protobuf -wheel: < - name: "infra/python/wheels/protobuf-py2_py3" - version: "version:3.6.1" -> - -# iam.admin.v1 -wheel: < - name: "infra/python/wheels/grpc-google-iam-admin-v1-py2_py3" - version: "version:0.10.0" -> - -# iam.admin.v1's dependencies -wheel: < - name: "infra/python/wheels/grpc-google-iam-v1-py2_py3" - version: "version:0.11.4" -> - -wheel: < - name: "infra/python/wheels/googleapis-common-protos-py2_py3" - version: "version:1.5.3" -> - -wheel: < - name: "infra/python/wheels/grpcio/${vpython_platform}" - version: "version:1.4.0" -> - -wheel: < - name: "infra/python/wheels/futures-py2_py3" - version: "version:3.1.1" -> - -wheel: < - name: "infra/python/wheels/enum34-py2" - version: "version:1.1.6" -> - -wheel: < - name: "infra/python/wheels/absl-py-py2_py3" - version: "version:0.7.1" -> - -wheel: < - name: "infra/python/wheels/wheel-py2_py3" - version: "version:0.33.1" -> - -wheel: < - name: "infra/python/wheels/requests-py2_py3" - version: "version:2.13.0" ->
diff --git a/chrome/test/enterprise/e2e/.vpython3 b/chrome/test/enterprise/e2e/.vpython3 new file mode 100644 index 0000000..818a6056 --- /dev/null +++ b/chrome/test/enterprise/e2e/.vpython3
@@ -0,0 +1,144 @@ +# This file defines all the extra packages we need to install to run the python +# scripts in our repo and is used in LUCI to create reproducible bubbles in +# which to run our ./test.py script. +# +# You can also use this locally by invoking `vpython` instead of `python` when +# running the test scripts. +# +# More information: +# https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md +python_version: "3.8" + +wheel: < + name: "infra/celab/celab/windows-amd64" + # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8820786327162315505 + version: "y9-Qg-fAfAomhA0jHYVRQ_o767NoGSg5CVJ1Gv0OW2QC" +> + +# googleapiclient +wheel: < + name: "infra/python/wheels/google-api-python-client-py2_py3" + version: "version:1.12.8" +> + +# googleapiclient's dependencies +wheel: < + name: "infra/python/wheels/cachetools-py2_py3" + version: "version:2.0.1" +> +wheel: < + name: "infra/python/wheels/google-api-core-py2_py3" + version: "version:1.25.1" +> +wheel: < + name: "infra/python/wheels/google-auth-py2_py3" + version: "version:1.35.0" +> +wheel: < + name: "infra/python/wheels/google-auth-httplib2-py2_py3" + version: "version:0.1.0" +> +wheel: < + name: "infra/python/wheels/httplib2-py3" + version: "version:0.19.1" +> +wheel: < + name: "infra/python/wheels/oauth2client-py2_py3" + version: "version:1.5.2" +> +wheel: < + name: "infra/python/wheels/pyasn1-py2_py3" + version: "version:0.4.8" +> +wheel: < + name: "infra/python/wheels/pyasn1_modules-py2_py3" + version: "version:0.2.8" +> +wheel: < + name: "infra/python/wheels/pytz-py2_py3" + version: "version:2021.1" +> +wheel: < + name: "infra/python/wheels/pyparsing-py2_py3" + version: "version:2.4.7" +> +wheel: < + name: "infra/python/wheels/requests-py2_py3" + version: "version:2.26.0" +> +wheel: < + name: "infra/python/wheels/idna-py2_py3" + version: "version:2.8" +> +wheel: < + name: "infra/python/wheels/charset_normalizer-py3" + version: "version:2.0.4" +> +wheel: < + name: "infra/python/wheels/certifi-py2_py3" + version: "version:2021.5.30" +> +wheel: < + name: "infra/python/wheels/urllib3-py2_py3" + version: "version:1.26.6" +> +wheel: < + name: "infra/python/wheels/rsa-py2_py3" + version: "version:3.4.2" +> +wheel: < + name: "infra/python/wheels/six-py2_py3" + version: "version:1.16.0" +> +wheel: < + name: "infra/python/wheels/uritemplate-py2_py3" + version: "version:3.0.0" +> + +# google.protobuf +wheel: < + name: "infra/python/wheels/protobuf-py2_py3" + version: "version:3.18.1" +> + +# iam.admin.v1 +wheel: < + name: "infra/python/wheels/grpc-google-iam-admin-v1-py2_py3" + version: "version:0.10.0" +> + +# iam.admin.v1's dependencies +wheel: < + name: "infra/python/wheels/grpc-google-iam-v1-py2_py3" + version: "version:0.11.4" +> + +wheel: < + name: "infra/python/wheels/googleapis-common-protos-py2_py3" + version: "version:1.52.0" +> + +wheel: < + name: "infra/python/wheels/grpcio/${vpython_platform}" + version: "version:1.39.0" +> + +wheel: < + name: "infra/python/wheels/futures-py2_py3" + version: "version:3.1.1" +> + +wheel: < + name: "infra/python/wheels/enum34-py2_py3" + version: "version:1.1.6" +> + +wheel: < + name: "infra/python/wheels/absl-py-py2_py3" + version: "version:0.7.1" +> + +wheel: < + name: "infra/python/wheels/wheel-py2_py3" + version: "version:0.33.1" +>
diff --git a/chrome/test/enterprise/e2e/connector/__init__.py b/chrome/test/enterprise/e2e/connector/__init__.py index 4f8e110..5af2083f 100644 --- a/chrome/test/enterprise/e2e/connector/__init__.py +++ b/chrome/test/enterprise/e2e/connector/__init__.py
@@ -2,5 +2,5 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -from realtime_reporting_bce.realtime_reporting_bce_test import * -from reporting_connector_splunk.reporting_connector_splunk_test import * +from .realtime_reporting_bce.realtime_reporting_bce_test import * +from .reporting_connector_splunk.reporting_connector_splunk_test import *
diff --git a/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/realtime_reporting_bce_test.py b/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/realtime_reporting_bce_test.py index 48c80e9..6a30b2f67 100644 --- a/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/realtime_reporting_bce_test.py +++ b/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/realtime_reporting_bce_test.py
@@ -8,7 +8,7 @@ from chrome_ent_test.infra.core import before_all, category, environment, test from infra import ChromeEnterpriseTestCase -from reporting_server import RealTimeReportingServer +from .reporting_server import RealTimeReportingServer @category("chrome_only") @@ -22,7 +22,7 @@ serviceAccountKey = self.RunCommand(self.win_config['dc'], cmd).rstrip() localDir = os.path.dirname(os.path.abspath(__file__)) filePath = os.path.join(localDir, 'service_accountkey.json') - with open(filePath, 'w') as f: + with open(filePath, 'w', encoding="utf-8") as f: f.write(serviceAccountKey) @before_all @@ -34,7 +34,7 @@ def test_browser_enrolled_prod(self): path = "gs://%s/secrets/CELabOrg-enrollToken" % self.gsbucket cmd = r'gsutil cat ' + path - token = self.RunCommand(self.win_config['dc'], cmd).rstrip() + token = self.RunCommand(self.win_config['dc'], cmd).rstrip().decode() self.SetPolicy(self.win_config['dc'], r'CloudManagementEnrollmentToken', token, 'String')
diff --git a/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/reporting_server.py b/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/reporting_server.py index ae48000..1994f89 100644 --- a/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/reporting_server.py +++ b/chrome/test/enterprise/e2e/connector/realtime_reporting_bce/reporting_server.py
@@ -5,7 +5,7 @@ import os from googleapiclient.discovery import build -from oauth2client.service_account import ServiceAccountCredentials +from google.oauth2 import service_account class RealTimeReportingServer(): @@ -24,7 +24,7 @@ """ localDir = os.path.dirname(os.path.abspath(__file__)) filePath = os.path.join(localDir, 'service_accountkey.json') - credentials = ServiceAccountCredentials.from_json_keyfile_name( + credentials = service_account.Credentials.from_service_account_file( filePath, scopes=self.SCOPES) delegatedCreds = credentials.create_delegated(user_email)
diff --git a/chrome/test/enterprise/e2e/connector/reporting_connector_splunk/reporting_connector_splunk_test.py b/chrome/test/enterprise/e2e/connector/reporting_connector_splunk/reporting_connector_splunk_test.py index 5e29688f..d32e355 100644 --- a/chrome/test/enterprise/e2e/connector/reporting_connector_splunk/reporting_connector_splunk_test.py +++ b/chrome/test/enterprise/e2e/connector/reporting_connector_splunk/reporting_connector_splunk_test.py
@@ -8,7 +8,7 @@ from chrome_ent_test.infra.core import before_all, category, environment, test from infra import ChromeEnterpriseTestCase -from splunk_server import SplunkApiService +from .splunk_server import SplunkApiService @category("chrome_only") @@ -19,7 +19,7 @@ def getSplunkCredentials(self): path = "gs://%s/secrets/splunkInstances.json" % self.gsbucket cmd = r'gsutil cat ' + path - return self.RunCommand(self.win_config['dc'], cmd).rstrip() + return self.RunCommand(self.win_config['dc'], cmd).rstrip().decode() @before_all def setup(self):
diff --git a/chrome/test/enterprise/e2e/infra/__init__.py b/chrome/test/enterprise/e2e/infra/__init__.py index 9226ba6..ab8d267 100644 --- a/chrome/test/enterprise/e2e/infra/__init__.py +++ b/chrome/test/enterprise/e2e/infra/__init__.py
@@ -2,4 +2,4 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -from chrome_ent_test_case import ChromeEnterpriseTestCase \ No newline at end of file +from .chrome_ent_test_case import ChromeEnterpriseTestCase \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py b/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py index 4716277..606408122 100644 --- a/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py +++ b/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py
@@ -152,7 +152,7 @@ args = subprocess.list2cmdline(args) cmd = r'%s %s %s' % (self._pythonExecutablePath[instance_name], file_name, args) - return self.RunCommand(instance_name, cmd) + return self.RunCommand(instance_name, cmd).decode() def RunUITest(self, instance_name, test_file, timeout=300, args=[]): """Runs a UI test on an instance. @@ -181,7 +181,7 @@ file_name, args) cmd = (r'%s c:\cel\supporting_files\run_ui_test.py --timeout %s -- %s') % ( self._pythonExecutablePath[instance_name], timeout, ui_test_cmd) - return self.RunCommand(instance_name, cmd, timeout=timeout) + return self.RunCommand(instance_name, cmd, timeout=timeout).decode() def _generatePassword(self): """Generates a random password."""
diff --git a/chrome/test/enterprise/e2e/policy/__init__.py b/chrome/test/enterprise/e2e/policy/__init__.py index c3f4527..a9b499e72 100644 --- a/chrome/test/enterprise/e2e/policy/__init__.py +++ b/chrome/test/enterprise/e2e/policy/__init__.py
@@ -2,25 +2,25 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -from allow_deleting_browser_history.allow_deleting_browser_history import * -from apps_shortcut.apps_shortcut import * -from bookmarkbar_enabled.bookmarkbar_enabled import * -from cloud_management_enrollment_token.cloud_management_enrollment_token import * -from default_search_provider.default_search_provider import * -from extension_blocklist.extension_blocklist import * -from extension_forcelist.extension_forcelist import * -from extension_allowlist.extension_allowlist import * -from force_google_safe_search.force_google_safe_search import * -from fullscreen_allowed.fullscreen_allowed import * -from homepage.homepage import * -from password_manager_enabled.password_manager_enabled import * -from popups_allowed.popups_allowed import * -from restore_on_startup.restore_on_startup import * -from safe_browsing.safe_browsing import * -from translate_enabled.translate_enabled import * -from url_blocklist.url_blocklist import * -from url_allowlist.url_allowlist import * -from user_data_dir.user_data_dir import * -from webprotect_file_download.webprotect_file_download import * -from webprotect_bulk_text_entry.webprotect_bulk_text_entry import * -from youtube_restrict.youtube_restrict import * +from .allow_deleting_browser_history.allow_deleting_browser_history import * +from .apps_shortcut.apps_shortcut import * +from .bookmarkbar_enabled.bookmarkbar_enabled import * +from .cloud_management_enrollment_token.cloud_management_enrollment_token import * +from .default_search_provider.default_search_provider import * +from .extension_blocklist.extension_blocklist import * +from .extension_forcelist.extension_forcelist import * +from .extension_allowlist.extension_allowlist import * +from .force_google_safe_search.force_google_safe_search import * +from .fullscreen_allowed.fullscreen_allowed import * +from .homepage.homepage import * +from .password_manager_enabled.password_manager_enabled import * +from .popups_allowed.popups_allowed import * +from .restore_on_startup.restore_on_startup import * +from .safe_browsing.safe_browsing import * +from .translate_enabled.translate_enabled import * +from .url_blocklist.url_blocklist import * +from .url_allowlist.url_allowlist import * +from .user_data_dir.user_data_dir import * +from .webprotect_file_download.webprotect_file_download import * +from .webprotect_bulk_text_entry.webprotect_bulk_text_entry import * +from .youtube_restrict.youtube_restrict import *
diff --git a/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py index 3599ee4f..f57d195 100644 --- a/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py +++ b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py
@@ -32,7 +32,7 @@ if token == None: path = "gs://%s/secrets/enrollToken" % self.gsbucket cmd = r'gsutil cat ' + path - token = self.RunCommand(self.win_config['dc'], cmd).rstrip() + token = self.RunCommand(self.win_config['dc'], cmd).rstrip().decode() self.SetPolicy(self.win_config['dc'], r'CloudManagementEnrollmentToken', token, 'String') self.RunCommand(self.win_config['client'], 'gpupdate /force')
diff --git a/chrome/test/webapps/coverage/coverage_cros.tsv b/chrome/test/webapps/coverage/coverage_cros.tsv index 530b8b4..9b3d75d5 100644 --- a/chrome/test/webapps/coverage/coverage_cros.tsv +++ b/chrome/test/webapps/coverage/coverage_cros.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 48%, with partial coverage: 66% +# Full coverage: 52%, with partial coverage: 70% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 @@ -164,27 +164,27 @@ install_policy_app_windowed_shortcut_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 @@ -200,103 +200,103 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_color_correct🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 @@ -308,68 +308,57 @@ install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑
diff --git a/chrome/test/webapps/coverage/coverage_linux.tsv b/chrome/test/webapps/coverage/coverage_linux.tsv index 03969429..8259d32 100644 --- a/chrome/test/webapps/coverage/coverage_linux.tsv +++ b/chrome/test/webapps/coverage/coverage_linux.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 49%, with partial coverage: 66% +# Full coverage: 53%, with partial coverage: 70% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 @@ -187,27 +187,27 @@ install_policy_app_windowed_shortcut_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 @@ -223,115 +223,115 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_color_correct🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 @@ -343,80 +343,65 @@ install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑
diff --git a/chrome/test/webapps/coverage/coverage_mac.tsv b/chrome/test/webapps/coverage/coverage_mac.tsv index d416809..170ccf0 100644 --- a/chrome/test/webapps/coverage/coverage_mac.tsv +++ b/chrome/test/webapps/coverage/coverage_mac.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 43%, with partial coverage: 58% +# Full coverage: 49%, with partial coverage: 65% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 @@ -73,22 +73,22 @@ install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_app_in_list_windowed_SiteC🌑 @@ -187,27 +187,27 @@ install_policy_app_windowed_shortcut_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 @@ -223,115 +223,115 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_color_correct🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 @@ -343,80 +343,65 @@ install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_menu_option_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_menu_option_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_menu_option_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 @@ -541,20 +526,20 @@ install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteC🌑 @@ -565,27 +550,27 @@ sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 @@ -645,13 +630,13 @@ install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_platform_shortcut_not_exists_SiteC🌑 install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕
diff --git a/chrome/test/webapps/coverage/coverage_win.tsv b/chrome/test/webapps/coverage/coverage_win.tsv index 749c586..15dc3d4 100644 --- a/chrome/test/webapps/coverage/coverage_win.tsv +++ b/chrome/test/webapps/coverage/coverage_win.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 51%, with partial coverage: 68% +# Full coverage: 54%, with partial coverage: 71% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_window_title_site_a_is_SiteAUpdated🌑 @@ -187,27 +187,27 @@ install_policy_app_windowed_shortcut_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌑 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 @@ -223,115 +223,115 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct🌑 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_color_correct🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_tab_not_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_tab_not_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_not_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_browser_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_minimal🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌑 check_window_display_standalone🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 @@ -343,80 +343,65 @@ install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_menu_option_SiteA🌑 check_tab_created🌑 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_tab_created🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌑 check_window_display_minimal🌑 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑
diff --git a/chrome/test/webapps/data/actions.csv b/chrome/test/webapps/data/actions.csv index 9ada38e..cc3eb28 100644 --- a/chrome/test/webapps/data/actions.csv +++ b/chrome/test/webapps/data/actions.csv
@@ -64,10 +64,10 @@ install_with_shortcut,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,install_policy_app_windowed_shortcut & install_policy_app_tabbed_shortcut & install_create_shortcut_windowed & install_omnibox_icon & install_menu_option & install_create_shortcut_tabbed,63,,,,,N/A (Parameterized Action),, launch,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,launch_from_menu_option & launch_from_launch_icon & launch_from_chrome_apps & launch_from_platform_shortcut,64,,,,,N/A (Parameterized Action),, launch_from_browser,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,launch_from_menu_option & launch_from_launch_icon & launch_from_chrome_apps,65,,,,,N/A (Parameterized Action),, -launch_no_launch_icon,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,launch_from_menu_option & launch_from_chrome_apps & launch_from_platform_shortcut,66,,,,,N/A (Parameterized Action),All ways to launch an app except by using the launch icon - which isn't available for 'browser' apps., +launch_from_shortcut_or_list,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,launch_from_chrome_apps & launch_from_platform_shortcut,66,,,,,N/A (Parameterized Action),All ways to launch an app that are still available for 'browser' apps., uninstall_by_user,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,uninstall_from_list & uninstall_from_menu & uninstall_from_os & uninstall_from_app_settings,67,,,,,N/A (Parameterized Action),, manifest_update_icons,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,,68,,,,,Not Yet Implemented,Updates the icon field in the manifest of the website.,finnur@ is working on this -launch_from_menu_option,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,,69,,,,,Not Yet Implemented,"Launch the web app by navigating the browser to the web app, and selecting the ""Launch _"" menu option in the 3-dot menu.",P1 +launch_from_menu_option,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,,69,,,,,Implemented,"Launch the web app by navigating the browser to the web app, and selecting the ""Launch _"" menu option in the 3-dot menu.","cliffordcheng@, P1" manifest_update_display_browser,SiteA* | SiteAFoo | SiteABar | SiteB | SiteC,,70,,,,,Implemented,Updates the display property of the manifest to 'browser' on the given site's manifest,"cliffordcheng@, P1" check_tab_not_created,,,94,,,,,Implemented,A tab was not created by the last state change action,"cliffordcheng@, P1" open_in_chrome,,,71,,,,,Implemented,Click on the 'open in chrome' link in the 3-dot menu of the app window,"cliffordcheng@, P1"
diff --git a/chrome/test/webapps/data/coverage_required.csv b/chrome/test/webapps/data/coverage_required.csv index 5811bbd..09fb430e 100644 --- a/chrome/test/webapps/data/coverage_required.csv +++ b/chrome/test/webapps/data/coverage_required.csv
@@ -63,12 +63,12 @@ WMLC,install_windowed,launch,check_window_display_standalone,install_windowed,launch,check_window_display_standalone,,,,, WMLC,install_tabbed & delete_platform_shortcut & create_shortcuts,launch_from_platform_shortcut,check_tab_created,install_tabbed,delete_platform_shortcut,create_shortcuts,launch_from_platform_shortcut,check_tab_created,,, WMLC,install_windowed & delete_platform_shortcut & create_shortcuts,launch_from_platform_shortcut,check_window_created,install_windowed,delete_platform_shortcut,create_shortcuts,launch_from_platform_shortcut,check_window_created,,, -WMLC,install_by_user_tabbed & install_policy_app_windowed,launch_no_launch_icon,check_tab_created,install_by_user_tabbed,install_policy_app_windowed,launch_no_launch_icon,check_tab_created,,,, -WMLC,install_by_user_tabbed & switch_profile_clients,launch_no_launch_icon,check_tab_created,install_by_user_tabbed,switch_profile_clients,launch_no_launch_icon,check_tab_created,,,, -WML,install_by_user_tabbed & switch_profile_clients & install_locally,launch_no_launch_icon,check_tab_created,install_by_user_tabbed,switch_profile_clients,install_locally,launch_no_launch_icon,check_tab_created,,, -WML,install_by_user_windowed & switch_profile_clients,launch_no_launch_icon,check_tab_created,install_by_user_windowed,switch_profile_clients,launch_no_launch_icon,check_tab_created,,,, -WMLC,install_windowed & set_open_in_tab,launch_no_launch_icon,check_tab_created,install_windowed,set_open_in_tab,launch_no_launch_icon,check_tab_created,,,, -WMLC,install_tabbed(SiteC),launch_no_launch_icon(SiteC),check_tab_created,install_tabbed(SiteC),launch_no_launch_icon(SiteC),check_tab_created,,,,, +WMLC,install_by_user_tabbed & install_policy_app_windowed,launch_from_shortcut_or_list,check_tab_created,install_by_user_tabbed,install_policy_app_windowed,launch_from_shortcut_or_list,check_tab_created,,,, +WMLC,install_by_user_tabbed & switch_profile_clients,launch_from_shortcut_or_list,check_tab_created,install_by_user_tabbed,switch_profile_clients,launch_from_shortcut_or_list,check_tab_created,,,, +WML,install_by_user_tabbed & switch_profile_clients & install_locally,launch_from_shortcut_or_list,check_tab_created,install_by_user_tabbed,switch_profile_clients,install_locally,launch_from_shortcut_or_list,check_tab_created,,, +WML,install_by_user_windowed & switch_profile_clients,launch_from_shortcut_or_list,check_tab_created,install_by_user_windowed,switch_profile_clients,launch_from_shortcut_or_list,check_tab_created,,,, +WMLC,install_windowed & set_open_in_tab,launch_from_shortcut_or_list,check_tab_created,install_windowed,set_open_in_tab,launch_from_shortcut_or_list,check_tab_created,,,, +WMLC,install_tabbed(SiteC),launch_from_shortcut_or_list(SiteC),check_tab_created,install_tabbed(SiteC),launch_from_shortcut_or_list(SiteC),check_tab_created,,,,, WMLC,install_windowed(SiteB),launch(SiteB),check_window_display_minimal,install_windowed(SiteB),launch(SiteB),check_window_display_minimal,,,,, WMLC,install_windowed(SiteC),launch(SiteC),check_window_created,install_windowed(SiteC),launch(SiteC),check_window_created,,,,, WMLC,install_by_user_windowed,manifest_update_icons,check_app_in_list_icon_correct,install_by_user_windowed,close_pwa,manifest_update_icons,check_app_in_list_icon_correct,,,,
diff --git a/chrome/test/webapps/data/framework_supported_actions.csv b/chrome/test/webapps/data/framework_supported_actions.csv index 5aca8cfd..b840ddf 100644 --- a/chrome/test/webapps/data/framework_supported_actions.csv +++ b/chrome/test/webapps/data/framework_supported_actions.csv
@@ -30,6 +30,7 @@ install_policy_app_windowed_shortcut, 🌓, 🌓, 🌓, 🌓, launch_from_chrome_apps, 🌓, 🌓, 🌓, 🌓, launch_from_launch_icon, 🌕, 🌕, 🌕, 🌕, +launch_from_menu_option, 🌕, 🌕, 🌕, 🌕, manifest_update_display_browser, 🌕, 🌕, 🌕, 🌕, manifest_update_display_minimal, 🌕, 🌕, 🌕, 🌕, navigate_browser, 🌕, 🌕, 🌕, 🌕,
diff --git a/chromeos/components/sync_wifi/local_network_collector_impl.h b/chromeos/components/sync_wifi/local_network_collector_impl.h index eb8ea28..47130fc 100644 --- a/chromeos/components/sync_wifi/local_network_collector_impl.h +++ b/chromeos/components/sync_wifi/local_network_collector_impl.h
@@ -78,6 +78,7 @@ void OnDeviceStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} private: std::string InitializeRequest();
diff --git a/chromeos/components/sync_wifi/network_test_helper.cc b/chromeos/components/sync_wifi/network_test_helper.cc index 9abb178..9087433 100644 --- a/chromeos/components/sync_wifi/network_test_helper.cc +++ b/chromeos/components/sync_wifi/network_test_helper.cc
@@ -67,6 +67,7 @@ } NetworkTestHelper::~NetworkTestHelper() { + Shutdown(); network_handler_test_helper_.reset(); LoginState::Shutdown(); ui_proxy_config_service_.reset();
diff --git a/chromeos/components/sync_wifi/synced_network_updater_impl.h b/chromeos/components/sync_wifi/synced_network_updater_impl.h index 80609fab..a30645ea 100644 --- a/chromeos/components/sync_wifi/synced_network_updater_impl.h +++ b/chromeos/components/sync_wifi/synced_network_updater_impl.h
@@ -56,6 +56,7 @@ void OnDeviceStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} private: void StartAddOrUpdateOperation(
diff --git a/chromeos/lacros/BUILD.gn b/chromeos/lacros/BUILD.gn index 9c5971cf..cb3e3c0 100644 --- a/chromeos/lacros/BUILD.gn +++ b/chromeos/lacros/BUILD.gn
@@ -28,6 +28,8 @@ "//ui/native_theme", ] sources = [ + "crosapi_pref_observer.cc", + "crosapi_pref_observer.h", "lacros_service.cc", "lacros_service.h", "lacros_service_never_blocking_state.cc",
diff --git a/chrome/browser/lacros/crosapi_pref_observer.cc b/chromeos/lacros/crosapi_pref_observer.cc similarity index 93% rename from chrome/browser/lacros/crosapi_pref_observer.cc rename to chromeos/lacros/crosapi_pref_observer.cc index b4c1e51..5d871195 100644 --- a/chrome/browser/lacros/crosapi_pref_observer.cc +++ b/chromeos/lacros/crosapi_pref_observer.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/lacros/crosapi_pref_observer.h" +#include "chromeos/lacros/crosapi_pref_observer.h" #include "base/callback.h" #include "chromeos/lacros/lacros_service.h"
diff --git a/chrome/browser/lacros/crosapi_pref_observer.h b/chromeos/lacros/crosapi_pref_observer.h similarity index 79% rename from chrome/browser/lacros/crosapi_pref_observer.h rename to chromeos/lacros/crosapi_pref_observer.h index 79a8a41..8ede195 100644 --- a/chrome/browser/lacros/crosapi_pref_observer.h +++ b/chromeos/lacros/crosapi_pref_observer.h
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_LACROS_CROSAPI_PREF_OBSERVER_H_ -#define CHROME_BROWSER_LACROS_CROSAPI_PREF_OBSERVER_H_ +#ifndef CHROMEOS_LACROS_CROSAPI_PREF_OBSERVER_H_ +#define CHROMEOS_LACROS_CROSAPI_PREF_OBSERVER_H_ #include "base/callback_forward.h" +#include "base/component_export.h" #include "base/gtest_prod_util.h" #include "base/values.h" #include "chromeos/crosapi/mojom/prefs.mojom.h" @@ -13,7 +14,8 @@ // Helper to simplify the crosapi::mojom::PrefObserver API. // Observes ash-chrome for changes in specified pref. -class CrosapiPrefObserver : public crosapi::mojom::PrefObserver { +class COMPONENT_EXPORT(CHROMEOS_LACROS) CrosapiPrefObserver + : public crosapi::mojom::PrefObserver { public: using PrefChangedCallback = base::RepeatingCallback<void(base::Value value)>; @@ -35,4 +37,4 @@ mojo::Receiver<crosapi::mojom::PrefObserver> receiver_{this}; }; -#endif // CHROME_BROWSER_LACROS_CROSAPI_PREF_OBSERVER_H_ +#endif // CHROMEOS_LACROS_CROSAPI_PREF_OBSERVER_H_
diff --git a/chromeos/network/docs/cros_connectivity_layers.svg b/chromeos/network/docs/cros_connectivity_layers.svg index a079ddd..ba7b6f7 100644 --- a/chromeos/network/docs/cros_connectivity_layers.svg +++ b/chromeos/network/docs/cros_connectivity_layers.svg
@@ -1 +1 @@ -<svg version="1.1" viewBox="0.0 0.0 1931.8503937007874 1390.5931758530185" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l1931.8503 0l0 1390.5931l-1931.8503 0l0 -1390.5931z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l1931.8503 0l0 1390.5931l-1931.8503 0z" fill-rule="evenodd"/><path fill="#efefef" d="m9.328085 225.08398l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m9.328085 225.08398l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path fill="#000000" d="m93.810814 257.124l-6.140625 -17.1875l3.765625 0l4.34375 12.71875l4.21875 -12.71875l3.671875 0l-6.15625 17.1875l-3.703125 0zm11.5859375 0l0 -17.1875l5.1875 0l3.125 11.71875l3.078125 -11.71875l5.203125 0l0 17.1875l-3.21875 0l0 -13.53125l-3.421875 13.53125l-3.328125 0l-3.40625 -13.53125l0 13.53125l-3.21875 0zm24.925774 0.296875l4.25 -17.765625l2.46875 0l-4.296875 17.765625l-2.421875 0zm23.101562 -6.609375l0 -2.90625l7.484375 0l0 6.84375q-1.09375 1.0625 -3.171875 1.875q-2.0625 0.796875 -4.171875 0.796875q-2.703125 0 -4.703125 -1.125q-2.0 -1.140625 -3.015625 -3.234375q-1.0 -2.109375 -1.0 -4.59375q0 -2.671875 1.125 -4.75q1.125 -2.09375 3.28125 -3.21875q1.65625 -0.84375 4.125 -0.84375q3.1875 0 4.984375 1.34375q1.8125 1.328125 2.328125 3.703125l-3.453125 0.640625q-0.359375 -1.265625 -1.359375 -2.0q-1.0 -0.734375 -2.5 -0.734375q-2.28125 0 -3.625 1.453125q-1.34375 1.4375 -1.34375 4.265625q0 3.0625 1.359375 4.59375q1.359375 1.53125 3.5625 1.53125q1.09375 0 2.1875 -0.421875q1.09375 -0.4375 1.890625 -1.046875l0 -2.171875l-3.984375 0zm18.855469 6.3125l0 -1.859375q-0.6875 0.984375 -1.796875 1.5625q-1.109375 0.578125 -2.328125 0.578125q-1.265625 0 -2.265625 -0.546875q-0.984375 -0.5625 -1.4375 -1.546875q-0.4375 -1.0 -0.4375 -2.765625l0 -7.875l3.296875 0l0 5.71875q0 2.625 0.171875 3.21875q0.1875 0.59375 0.65625 0.9375q0.484375 0.34375 1.234375 0.34375q0.84375 0 1.5 -0.453125q0.671875 -0.46875 0.921875 -1.15625q0.25 -0.6875 0.25 -3.359375l0 -5.25l3.28125 0l0 12.453125l-3.046875 0zm13.675781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm4.7851562 3.75l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm20.222656 -8.90625l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921875l0 4.390625l2.25 0zm8.269531 3.96875q0 -2.625 0.78125 -4.40625q0.59375 -1.3125 1.59375 -2.359375q1.015625 -1.046875 2.234375 -1.546875q1.59375 -0.671875 3.703125 -0.671875q3.796875 0 6.0625 2.359375q2.28125 2.34375 2.28125 6.546875q0 4.15625 -2.265625 6.515625q-2.25 2.34375 -6.03125 2.34375q-3.84375 0 -6.109375 -2.34375q-2.25 -2.34375 -2.25 -6.4375zm3.578125 -0.125q0 2.921875 1.34375 4.4375q1.34375 1.5 3.421875 1.5q2.078125 0 3.40625 -1.484375q1.328125 -1.5 1.328125 -4.5q0 -2.953125 -1.296875 -4.40625q-1.296875 -1.453125 -3.4375 -1.453125q-2.140625 0 -3.453125 1.484375q-1.3125 1.46875 -1.3125 4.421875zm14.917969 3.015625l3.375 -0.328125q0.296875 1.703125 1.21875 2.5q0.9375 0.796875 2.53125 0.796875q1.671875 0 2.515625 -0.703125q0.859375 -0.71875 0.859375 -1.671875q0 -0.609375 -0.359375 -1.03125q-0.359375 -0.421875 -1.25 -0.75q-0.609375 -0.203125 -2.78125 -0.75q-2.78125 -0.6875 -3.90625 -1.6875q-1.59375 -1.421875 -1.59375 -3.46875q0 -1.3125 0.75 -2.453125q0.75 -1.140625 2.140625 -1.734375q1.40625 -0.59375 3.390625 -0.59375q3.234375 0 4.859375 1.421875q1.640625 1.40625 1.71875 3.78125l-3.46875 0.140625q-0.21875 -1.3125 -0.953125 -1.890625q-0.734375 -0.59375 -2.203125 -0.59375q-1.5 0 -2.359375 0.625q-0.546875 0.40625 -0.546875 1.0625q0 0.609375 0.515625 1.046875q0.65625 0.546875 3.1875 1.15625q2.53125 0.59375 3.734375 1.234375q1.21875 0.640625 1.90625 1.75q0.6875 1.09375 0.6875 2.734375q0 1.46875 -0.828125 2.765625q-0.8125 1.28125 -2.3125 1.921875q-1.5 0.625 -3.75 0.625q-3.25 0 -5.0 -1.5q-1.75 -1.515625 -2.078125 -4.40625z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m918.6483 963.71655l394.01575 0l0 105.322876l-394.01575 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m918.6483 963.71655l394.01575 0l0 105.322876l-394.01575 0z" fill-rule="evenodd"/><path fill="#000000" d="m1073.8053 989.1678l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051025 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm10.375732 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292725 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.4938965 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm7.7663574 8.53125l0 -1.1875l10.859375 0l0 1.1875l-10.859375 0zm11.891357 0l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203857 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881104 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806519 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5269775 5.1875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.171875 -3.484375l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1021.31366 995.7475l188.685 0l0 21.45288l-188.685 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1022.4543 1002.96466l2.359436 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.562561 0l0 -9.671875zm16.197815 4.703125q0 -1.28125 0.625 -2.46875q0.625 -1.203125 1.78125 -1.828125q1.15625 -0.625 2.578125 -0.625q2.1875 0 3.59375 1.421875q1.40625 1.421875 1.40625 3.609375q0 2.1875 -1.421875 3.640625q-1.421875 1.4375 -3.5625 1.4375q-1.328125 0 -2.546875 -0.59375q-1.203125 -0.609375 -1.828125 -1.765625q-0.625 -1.171875 -0.625 -2.828125zm2.625 0.125q0 1.453125 0.671875 2.21875q0.6875 0.75 1.6875 0.75q1.0 0 1.671875 -0.75q0.6875 -0.765625 0.6875 -2.234375q0 -1.421875 -0.6875 -2.1875q-0.671875 -0.765625 -1.671875 -0.765625q-1.0 0 -1.6875 0.765625q-0.671875 0.765625 -0.671875 2.203125zm18.239746 4.84375l-2.390625 0l0 -1.421875q-0.59375 0.828125 -1.40625 1.234375q-0.796875 0.40625 -1.609375 0.40625q-1.671875 0 -2.859375 -1.34375q-1.1875 -1.34375 -1.1875 -3.75q0 -2.453125 1.15625 -3.734375q1.15625 -1.28125 2.921875 -1.28125q1.625 0 2.8125 1.34375l0 -4.8125l2.5625 0l0 13.359375zm-6.84375 -5.046875q0 1.546875 0.4375 2.234375q0.609375 1.015625 1.71875 1.015625q0.890625 0 1.5 -0.75q0.625 -0.765625 0.625 -2.25q0 -1.671875 -0.609375 -2.40625q-0.59375 -0.734375 -1.53125 -0.734375q-0.90625 0 -1.53125 0.734375q-0.609375 0.71875 -0.609375 2.15625zm14.958374 1.96875l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm4.4226074 -4.0l2.359375 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.5625 0l0 -9.671875zm16.588379 0l2.359375 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.5625 0l0 -9.671875zm18.697876 2.953125l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm13.84436 4.640625l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm4.505371 -6.71875l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm4.8132324 5.28125l2.921875 0.359375q0.0625 0.5 0.328125 0.6875q0.375 0.28125 1.15625 0.28125q1.0 0 1.5 -0.296875q0.328125 -0.203125 0.515625 -0.65625q0.109375 -0.3125 0.109375 -1.171875l0 -1.40625q-1.140625 1.5625 -2.890625 1.5625q-1.953125 0 -3.09375 -1.65625q-0.890625 -1.296875 -0.890625 -3.234375q0 -2.4375 1.171875 -3.71875q1.171875 -1.28125 2.90625 -1.28125q1.796875 0 2.96875 1.578125l0 -1.359375l2.390625 0l0 8.671875q0 1.71875 -0.28125 2.5625q-0.28125 0.84375 -0.796875 1.328125q-0.5 0.484375 -1.359375 0.75q-0.84375 0.28125 -2.15625 0.28125q-2.453125 0 -3.484375 -0.84375q-1.03125 -0.84375 -1.03125 -2.125q0 -0.140625 0.015625 -0.3125zm2.28125 -5.671875q0 1.53125 0.59375 2.25q0.59375 0.71875 1.46875 0.71875q0.9375 0 1.578125 -0.734375q0.65625 -0.734375 0.65625 -2.171875q0 -1.515625 -0.625 -2.234375q-0.609375 -0.734375 -1.5625 -0.734375q-0.921875 0 -1.515625 0.71875q-0.59375 0.71875 -0.59375 2.1875zm14.942871 1.953125l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm7.0788574 5.671875l-2.5625 0l0 -9.671875l2.375 0l0 1.375q0.609375 -0.984375 1.09375 -1.28125q0.484375 -0.3125 1.109375 -0.3125q0.875 0 1.6875 0.484375l-0.796875 2.234375q-0.640625 -0.421875 -1.203125 -0.421875q-0.53125 0 -0.90625 0.296875q-0.375 0.296875 -0.59375 1.078125q-0.203125 0.765625 -0.203125 3.234375l0 2.984375zm4.510254 -3.5625l0 -2.5625l5.03125 0l0 2.5625l-5.03125 0zm15.3063965 3.5625l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm8.192871 -3.078125l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm3.3913574 5.671875l3.484375 -4.984375l-3.34375 -4.6875l3.125 0l1.71875 2.65625l1.796875 -2.65625l3.015625 0l-3.28125 4.578125l3.578125 5.09375l-3.140625 0l-1.96875 -3.0l-1.984375 3.0l-3.0 0zm16.047607 -9.671875l0 2.03125l-1.75 0l0 3.90625q0 1.1875 0.046875 1.390625q0.046875 0.1875 0.21875 0.3125q0.1875 0.125 0.4375 0.125q0.359375 0 1.03125 -0.25l0.21875 2.0q-0.890625 0.375 -2.015625 0.375q-0.703125 0 -1.265625 -0.234375q-0.546875 -0.234375 -0.8125 -0.59375q-0.25 -0.375 -0.34375 -1.0q-0.09375 -0.453125 -0.09375 -1.8125l0 -4.21875l-1.171875 0l0 -2.03125l1.171875 0l0 -1.921875l2.578125 -1.5l0 3.421875l1.75 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m1209.9987 995.7475l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1021.31366 1013.84985l188.685 0l0 1.6799927l-188.685 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/third_party/modemmanager-next/;l%3D1?q%3Dmodemmanager%26ss%3Dpiper%252FGoogle%252Fchromeos_public&sa=D&source=editors&ust=1638577908180000&usg=AOvVaw3TEU2fwnxTqbVGtu0_JiI2" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1021.31366 994.71655l188.685 0l0 22.399963l-188.685 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#c9daf8" d="m383.7874 172.4672l1521.4802 0l0 442.51968l-1521.4802 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m383.7874 172.4672l1521.4802 0l0 442.51968l-1521.4802 0z" fill-rule="evenodd"/><path fill="#000000" d="m1111.9221 198.19469l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5625 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375 5.828125 -2.375q3.15625 0 5.125 1.859375q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.34375 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.375 0 2.375 -0.875q1.0 -0.890625 1.421875 -2.765625zm9.597656 -10.875l0 6.328125q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm14.535156 17.1875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm11.800781 -6.234375l3.03125 0l0 1.703125q1.625 -1.984375 3.875 -1.984375q1.203125 0 2.078125 0.5q0.875 0.484375 1.4375 1.484375q0.828125 -1.0 1.765625 -1.484375q0.953125 -0.5 2.03125 -0.5q1.375 0 2.3125 0.5625q0.953125 0.5625 1.421875 1.640625q0.34375 0.796875 0.34375 2.578125l0 7.953125l-3.296875 0l0 -7.109375q0 -1.859375 -0.328125 -2.390625q-0.46875 -0.703125 -1.40625 -0.703125q-0.703125 0 -1.3125 0.421875q-0.609375 0.421875 -0.875 1.234375q-0.265625 0.8125 -0.265625 2.5625l0 5.984375l-3.296875 0l0 -6.828125q0 -1.8125 -0.171875 -2.328125q-0.171875 -0.53125 -0.546875 -0.78125q-0.375 -0.265625 -1.0 -0.265625q-0.765625 0 -1.375 0.40625q-0.609375 0.40625 -0.875 1.1875q-0.265625 0.765625 -0.265625 2.5625l0 6.046875l-3.28125 0l0 -12.453125zm28.792969 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0z" fill-rule="nonzero"/><defs><linearGradient id="p.1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(22.75616333875044 0.0 0.0 22.75616333875044 0.0 0.0)" spreadMethod="pad" x1="50.0253847639223" y1="25.41507032009087" x2="33.93449513200751" y2="9.323885132124536"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.1)" d="m428.52756 555.8609l687.37 0l0 44.97638l-687.37 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m428.52756 555.8609l687.37 0l0 44.97638l-687.37 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m671.0997 565.5953l121.489136 0l0 15.32605l-121.489136 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m676.4903 575.12964l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0165405 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm6.2578125 2.21875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm9.062378 -0.15625l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm7.7093506 3.453125l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm10.865601 3.5l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm6.2578125 2.21875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm4.109192 -2.21875l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.1328125 2.0625l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.4281006 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9298706 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9610596 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.1017456 0.15625l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0z" fill-rule="nonzero"/><path fill="#000000" d="m797.32306 577.6609l0 -9.546875l3.28125 0q1.109375 0 1.703125 0.140625q0.8125 0.1875 1.390625 0.6875q0.765625 0.640625 1.140625 1.640625q0.375 0.984375 0.375 2.25q0 1.09375 -0.265625 1.9375q-0.25 0.828125 -0.65625 1.390625q-0.390625 0.546875 -0.859375 0.859375q-0.46875 0.3125 -1.140625 0.484375q-0.65625 0.15625 -1.53125 0.15625l-3.4375 0zm1.265625 -1.125l2.03125 0q0.9375 0 1.46875 -0.171875q0.546875 -0.1875 0.875 -0.5q0.4375 -0.453125 0.6875 -1.203125q0.25 -0.765625 0.25 -1.84375q0 -1.5 -0.5 -2.296875q-0.484375 -0.8125 -1.1875 -1.078125q-0.5 -0.203125 -1.625 -0.203125l-2.0 0l0 7.296875zm8.296997 1.125l0 -9.546875l3.59375 0q1.09375 0 1.75 0.296875q0.65625 0.28125 1.03125 0.890625q0.375 0.609375 0.375 1.265625q0 0.609375 -0.34375 1.15625q-0.328125 0.53125 -0.984375 0.859375q0.859375 0.25 1.328125 0.875q0.46875 0.609375 0.46875 1.4375q0 0.671875 -0.296875 1.25q-0.28125 0.578125 -0.703125 0.890625q-0.40625 0.3125 -1.03125 0.46875q-0.625 0.15625 -1.546875 0.15625l-3.640625 0zm1.265625 -5.53125l2.0625 0q0.84375 0 1.203125 -0.109375q0.484375 -0.140625 0.71875 -0.46875q0.25 -0.34375 0.25 -0.84375q0 -0.46875 -0.234375 -0.828125q-0.21875 -0.359375 -0.640625 -0.5q-0.421875 -0.140625 -1.453125 -0.140625l-1.90625 0l0 2.890625zm0 4.40625l2.375 0q0.609375 0 0.859375 -0.046875q0.4375 -0.078125 0.734375 -0.25q0.296875 -0.1875 0.484375 -0.53125q0.1875 -0.359375 0.1875 -0.8125q0 -0.53125 -0.28125 -0.921875q-0.265625 -0.40625 -0.75 -0.5625q-0.484375 -0.15625 -1.40625 -0.15625l-2.203125 0l0 3.28125zm12.0616455 1.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm17.78894 -1.28125l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.656372 3.34375l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9923706 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.6798096 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.6717529 -1.015625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" fill-rule="nonzero"/><path fill="#000099" d="m671.0997 578.5276l121.489075 0l0 1.1999512l-121.489075 0l0 -1.1999512z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/dbus/shill/?q%3Dchromeos%252Fdbus%252Fshill%252F%26ss%3Dchromium&sa=D&source=editors&ust=1638577908190000&usg=AOvVaw22yN5gsjrQuI5P92yA_mhH" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m671.0997 564.8609l121.489075 0l0 16.0l-121.489075 0l0 -16.0z" fill-rule="nonzero"/></a><defs><linearGradient id="p.2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(18.572973184015446 0.0 0.0 18.572973184015446 0.0 0.0)" spreadMethod="pad" x1="54.366384790409825" y1="24.411686394668724" x2="41.23343205387387" y2="11.278488561921765"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.2)" d="m591.33594 383.96326l348.97638 0l0 138.86615l-348.97638 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m591.33594 383.96326l348.97638 0l0 138.86615l-348.97638 0z" fill-rule="evenodd"/><path fill="#000000" d="m632.75385 408.32324l0 -11.453125l2.25 0l4.6875 7.640625l0 -7.640625l2.15625 0l0 11.453125l-2.328125 0l-4.609375 -7.46875l0 7.46875l-2.15625 0zm16.320312 -2.640625l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm7.7734375 -3.4375l0 1.75l-1.5 0l0 3.34375q0 1.015625 0.046875 1.1875q0.046875 0.15625 0.1875 0.265625q0.15625 0.109375 0.375 0.109375q0.3125 0 0.890625 -0.203125l0.1875 1.703125q-0.765625 0.328125 -1.734375 0.328125q-0.59375 0 -1.078125 -0.203125q-0.46875 -0.203125 -0.703125 -0.515625q-0.21875 -0.3125 -0.296875 -0.859375q-0.078125 -0.375 -0.078125 -1.546875l0 -3.609375l-1.0 0l0 -1.75l1.0 0l0 -1.65625l2.203125 -1.28125l0 2.9375l1.5 0zm3.078125 8.296875l-2.625 -8.296875l2.125 0l1.5625 5.4375l1.421875 -5.4375l2.125 0l1.375 5.4375l1.59375 -5.4375l2.15625 0l-2.65625 8.296875l-2.109375 0l-1.4375 -5.34375l-1.40625 5.34375l-2.125 0zm10.3828125 -4.265625q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.53125 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203125 1.21875 1.203125 3.09375q0 1.875 -1.21875 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.03125 -0.515625 -1.578125 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.25 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm10.1328125 4.15625l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625zm4.0546875 0l0 -11.453125l2.1875 0l0 6.078125l2.578125 -2.921875l2.703125 0l-2.84375 3.03125l3.046875 5.265625l-2.375 0l-2.078125 -3.734375l-1.03125 1.078125l0 2.65625l-2.1875 0zm8.9921875 0l0 -11.453125l2.3125 0l0 4.5l4.53125 0l0 -4.5l2.3125 0l0 11.453125l-2.3125 0l0 -5.015625l-4.53125 0l0 5.015625l-2.3125 0zm13.1796875 -5.765625l-2.0 -0.359375q0.34375 -1.203125 1.15625 -1.78125q0.828125 -0.578125 2.4375 -0.578125q1.46875 0 2.1875 0.34375q0.71875 0.34375 1.015625 0.890625q0.296875 0.53125 0.296875 1.953125l-0.03125 2.5625q0 1.09375 0.109375 1.625q0.109375 0.515625 0.390625 1.109375l-2.171875 0q-0.078125 -0.21875 -0.203125 -0.65625q-0.0625 -0.1875 -0.078125 -0.25q-0.5625 0.546875 -1.203125 0.828125q-0.640625 0.265625 -1.375 0.265625q-1.28125 0 -2.015625 -0.6875q-0.734375 -0.703125 -0.734375 -1.765625q0 -0.703125 0.328125 -1.25q0.34375 -0.5625 0.9375 -0.84375q0.609375 -0.296875 1.75 -0.515625q1.546875 -0.296875 2.140625 -0.546875l0 -0.21875q0 -0.625 -0.3125 -0.890625q-0.3125 -0.28125 -1.1875 -0.28125q-0.578125 0 -0.90625 0.234375q-0.328125 0.234375 -0.53125 0.8125zm2.9375 1.78125q-0.421875 0.140625 -1.34375 0.34375q-0.90625 0.1875 -1.1875 0.375q-0.4375 0.296875 -0.4375 0.765625q0 0.46875 0.34375 0.8125q0.34375 0.328125 0.875 0.328125q0.59375 0 1.140625 -0.390625q0.390625 -0.296875 0.515625 -0.734375q0.09375 -0.28125 0.09375 -1.0625l0 -0.4375zm11.8671875 3.984375l-2.203125 0l0 -4.234375q0 -1.34375 -0.140625 -1.734375q-0.140625 -0.40625 -0.453125 -0.625q-0.3125 -0.21875 -0.765625 -0.21875q-0.5625 0 -1.015625 0.3125q-0.453125 0.3125 -0.625 0.828125q-0.171875 0.515625 -0.171875 1.90625l0 3.765625l-2.1875 0l0 -8.296875l2.03125 0l0 1.21875q1.09375 -1.40625 2.734375 -1.40625q0.734375 0 1.328125 0.265625q0.609375 0.25 0.90625 0.65625q0.3125 0.40625 0.4375 0.921875q0.125 0.515625 0.125 1.484375l0 5.15625zm9.8359375 0l-2.046875 0l0 -1.21875q-0.5 0.703125 -1.203125 1.0625q-0.6875 0.34375 -1.390625 0.34375q-1.421875 0 -2.453125 -1.15625q-1.015625 -1.15625 -1.015625 -3.21875q0 -2.109375 0.984375 -3.203125q1.0 -1.09375 2.515625 -1.09375q1.390625 0 2.40625 1.15625l0 -4.125l2.203125 0l0 11.453125zm-5.859375 -4.328125q0 1.328125 0.359375 1.921875q0.53125 0.859375 1.484375 0.859375q0.765625 0 1.296875 -0.640625q0.53125 -0.65625 0.53125 -1.9375q0 -1.421875 -0.515625 -2.046875q-0.515625 -0.640625 -1.328125 -0.640625q-0.78125 0 -1.3125 0.625q-0.515625 0.625 -0.515625 1.859375zm8.0234375 4.328125l0 -11.453125l2.1875 0l0 11.453125l-2.1875 0zm9.2421875 -2.640625l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm6.0703125 4.859375l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625z" fill-rule="nonzero"/><path fill="#000000" d="m762.457 411.69824q-1.171875 -1.46875 -1.984375 -3.4375q-0.796875 -1.984375 -0.796875 -4.09375q0 -1.859375 0.609375 -3.5625q0.703125 -1.96875 2.171875 -3.9375l1.0 0q-0.9375 1.625 -1.25 2.328125q-0.46875 1.078125 -0.75 2.25q-0.328125 1.453125 -0.328125 2.9375q0 3.75 2.328125 7.515625l-1.0 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m764.0351 393.83887l130.71875 0l0 18.398438l-130.71875 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m770.50385 405.27637l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8828125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.3046875 0.796875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4140625 1.671875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm7.5 2.6875l3.328125 -11.859375l1.125 0l-3.3125 11.859375l-1.140625 0zm5.5078125 -0.203125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m896.7382 411.69824l-1.015625 0q2.34375 -3.765625 2.34375 -7.515625q0 -1.46875 -0.34375 -2.921875q-0.265625 -1.171875 -0.734375 -2.25q-0.3125 -0.703125 -1.265625 -2.34375l1.015625 0q1.46875 1.96875 2.171875 3.9375q0.59375 1.703125 0.59375 3.5625q0 2.109375 -0.8125 4.09375q-0.796875 1.96875 -1.953125 3.4375z" fill-rule="nonzero"/><path fill="#000099" d="m764.0351 409.36325l130.71875 0l0 1.4400024l-130.71875 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#000000" d="m644.957 442.30762l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9453125 4.15625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm12.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm13.96875 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.5625 3.046875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.0390625 1.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.0 0l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm14.234375 -0.1875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm16.070312 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm17.828125 1.109375l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm11.1953125 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.375 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm8.40625 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m860.5429 431.83887l35.554688 0l0 18.398438l-35.554688 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m861.32416 440.74512q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm11.3203125 5.5625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm19.742188 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875z" fill-rule="nonzero"/><path fill="#000099" d="m860.5429 447.36325l35.554688 0l0 1.4400024l-35.554688 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#000000" d="m615.3046 462.27637l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm9.2265625 0l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.296875l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4453125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm16.070312 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm12.078125 0.46875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm11.015625 3.6875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8984375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5234375 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.9453125 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm13.9375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.2734375 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm12.40625 7.328125l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6171875 4.109375l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm10.2734375 4.15625l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9296875 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.6328125 1.46875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm17.6875 3.921875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm13.453125 1.125l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.0 2.015625q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm9.0078125 1.125l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875z" fill-rule="nonzero"/><path fill="#000000" d="m608.8984 481.83887l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 2.484375l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.0703125 1.625l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 2.484375l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.3671875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm5.296875 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm8.21875 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm11.015625 3.6875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8984375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5234375 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm13.4375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm9.2265625 0l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.296875l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4453125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm16.070312 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm15.484375 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm12.265625 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm5.296875 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m744.5546 499.30762l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm3.2109375 4.015625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8828125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 4.953125l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/network/&sa=D&source=editors&ust=1638577908205000&usg=AOvVaw3RF8_-dncJ_vqG_RuGuF21" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m764.0351 392.96326l130.71875 0l0 19.200012l-130.71875 0l0 -19.200012z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:components/onc/docs/onc_spec.md?q%3Donc_spec.md%26ss%3Dchromium&sa=D&source=editors&ust=1638577908205000&usg=AOvVaw1LrGntAsQ_eaS6itTnk7eG" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m860.5429 430.96326l35.554688 0l0 19.200012l-35.554688 0l0 -19.200012z" fill-rule="nonzero"/></a><path fill="#000000" fill-opacity="0.0" d="m972.25195 367.22864l0.06298828 -0.9763794" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m972.25195 367.22864l0.06298828 -0.9763794" fill-rule="evenodd"/><path fill="#6d9eeb" d="m428.5223 673.2756l687.37 0l0 224.62994l-687.37 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m428.5223 673.2756l687.37 0l0 224.62994l-687.37 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m746.8714 683.58905l50.671875 0l0 27.597656l-50.671875 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m747.7464 699.72186l3.375 -0.328125q0.296875 1.703125 1.21875 2.5q0.9375 0.796875 2.53125 0.796875q1.671875 0 2.515625 -0.703125q0.859375 -0.71875 0.859375 -1.671875q0 -0.609375 -0.359375 -1.03125q-0.359375 -0.421875 -1.25 -0.75q-0.609375 -0.203125 -2.78125 -0.75q-2.78125 -0.6875 -3.90625 -1.6875q-1.59375 -1.421875 -1.59375 -3.46875q0 -1.3125 0.75 -2.453125q0.75 -1.140625 2.140625 -1.734375q1.40625 -0.59375 3.390625 -0.59375q3.234375 0 4.859375 1.421875q1.640625 1.40625 1.71875 3.78125l-3.46875 0.140625q-0.21875 -1.3125 -0.953125 -1.890625q-0.734375 -0.59375 -2.203125 -0.59375q-1.5 0 -2.359375 0.625q-0.546875 0.40625 -0.546875 1.0625q0 0.609375 0.515625 1.046875q0.65625 0.546875 3.1875 1.15625q2.53125 0.59375 3.734375 1.234375q1.21875 0.640625 1.90625 1.75q0.6875 1.09375 0.6875 2.734375q0 1.46875 -0.828125 2.765625q-0.8125 1.28125 -2.3125 1.921875q-1.5 0.625 -3.75 0.625q-3.25 0 -5.0 -1.5q-1.75 -1.515625 -2.078125 -4.40625zm20.132812 -11.59375l0 6.328125q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm11.378906 3.046875l0 -3.046875l3.296875 0l0 3.046875l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm6.6679688 0l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm6.6679688 0l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m797.5433 683.58905l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m746.8714 706.8756l50.671875 0l0 2.1599731l-50.671875 0l0 -2.1599731z" fill-rule="nonzero"/><path fill="#000000" d="m468.4378 745.6356l0 -11.453125l5.078125 0q1.53125 0 2.328125 0.3125q0.796875 0.296875 1.265625 1.078125q0.484375 0.78125 0.484375 1.734375q0 1.21875 -0.796875 2.0625q-0.78125 0.828125 -2.4375 1.046875q0.609375 0.296875 0.921875 0.578125q0.65625 0.609375 1.25 1.515625l2.0 3.125l-1.90625 0l-1.515625 -2.390625q-0.671875 -1.03125 -1.109375 -1.578125q-0.421875 -0.546875 -0.765625 -0.765625q-0.328125 -0.21875 -0.6875 -0.296875q-0.25 -0.0625 -0.84375 -0.0625l-1.75 0l0 5.09375l-1.515625 0zm1.515625 -6.40625l3.25 0q1.046875 0 1.625 -0.203125q0.59375 -0.21875 0.890625 -0.6875q0.3125 -0.484375 0.3125 -1.03125q0 -0.8125 -0.59375 -1.328125q-0.59375 -0.53125 -1.859375 -0.53125l-3.625 0l0 3.78125zm15.5078125 3.734375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 5.671875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.1015625 -0.046875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 -7.359375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.5859375 4.21875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm12.609375 4.953125l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm15.1953125 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm9.2265625 0l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.296875l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4453125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.6328125 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm14.609375 4.296875l-3.03125 -11.453125l1.546875 0l1.75 7.5q0.28125 1.1875 0.484375 2.34375q0.4375 -1.828125 0.515625 -2.109375l2.171875 -7.734375l1.828125 0l1.640625 5.796875q0.625 2.15625 0.890625 4.046875q0.21875 -1.078125 0.578125 -2.484375l1.796875 -7.359375l1.515625 0l-3.140625 11.453125l-1.453125 0l-2.421875 -8.734375q-0.296875 -1.09375 -0.359375 -1.34375q-0.171875 0.796875 -0.328125 1.34375l-2.4375 8.734375l-1.546875 0zm12.9296875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.8046875 0l0 -11.453125l7.734375 0l0 1.34375l-6.21875 0l0 3.546875l5.375 0l0 1.359375l-5.375 0l0 5.203125l-1.515625 0zm9.5234375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.9140625 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm16.875 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.8828125 1.34375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8046875 4.953125l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8203125 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm8.734375 0l0 -11.453125l8.28125 0l0 1.34375l-6.765625 0l0 3.515625l6.34375 0l0 1.34375l-6.34375 0l0 3.890625l7.03125 0l0 1.359375l-8.546875 0zm13.53125 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7421875 1.265625l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm8.25 -5.578125q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm11.1640625 8.75l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm13.3046875 1.4375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm12.3515625 0l-4.4375 -11.453125l1.640625 0l2.96875 8.3125q0.359375 1.0 0.609375 1.875q0.265625 -0.9375 0.609375 -1.875l3.09375 -8.3125l1.546875 0l-4.484375 11.453125l-1.546875 0zm7.390625 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm9.140625 6.015625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm11.7578125 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm13.9375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.273499 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.000061 0 -1.828186 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859436 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.437561 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578186 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.93756104 0 -1.562561 0.765625q-0.625 0.765625 -0.625 2.421875zm12.515686 4.140625l0 -11.453125l1.515625 0l0 10.09375l5.640625 0l0 1.359375l-7.15625 0zm15.7890625 -1.359375l0 1.359375l-7.578125 0q-0.015625 -0.515625 0.171875 -0.984375q0.28125 -0.765625 0.921875 -1.515625q0.640625 -0.75 1.84375 -1.734375q1.859375 -1.53125 2.515625 -2.421875q0.65625 -0.90625 0.65625 -1.703125q0 -0.828125 -0.59375 -1.40625q-0.59375 -0.578125 -1.5625 -0.578125q-1.015625 0 -1.625 0.609375q-0.609375 0.609375 -0.609375 1.6875l-1.453125 -0.140625q0.15625 -1.625 1.125 -2.46875q0.96875 -0.84375 2.59375 -0.84375q1.65625 0 2.609375 0.921875q0.96875 0.90625 0.96875 2.25q0 0.6875 -0.28125 1.359375q-0.28125 0.65625 -0.9375 1.390625q-0.65625 0.734375 -2.171875 2.015625q-1.265625 1.0625 -1.625 1.453125q-0.359375 0.375 -0.59375 0.75l5.625 0zm4.9921875 1.359375l0 -10.109375l-3.78125 0l0 -1.34375l9.078125 0l0 1.34375l-3.78125 0l0 10.109375l-1.515625 0zm6.8515625 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm7.921875 6.21875l3.328125 -11.859375l1.125 0l-3.3125 11.859375l-1.140625 0zm5.9453125 -0.203125l0 -11.453125l1.515625 0l0 11.453125l-1.515625 0zm4.1796875 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.640625 2.328125l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.6875 1.015625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm10.4921875 3.046875l-4.4375 -11.453125l1.640625 0l2.96875 8.3125q0.359375 1.0 0.609375 1.875q0.265625 -0.9375 0.609375 -1.875l3.09375 -8.3125l1.546875 0l-4.484375 11.453125l-1.546875 0zm7.390625 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm9.140625 6.015625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm11.7890625 0l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><path fill="#000000" d="m640.0472 764.6356l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.96875 6.015625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm10.2734375 4.15625l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9296875 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.6328125 1.46875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm13.0078125 2.484375l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm8.0 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.6328125 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm11.875 1.8125l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm15.34375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm20.765625 0.140625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm3.2109375 4.015625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8828125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 4.953125l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/README.md&sa=D&source=editors&ust=1638577908213000&usg=AOvVaw0zvtzR9Rp3BvTXJ5t-eH42" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m746.8714 682.2756l50.671875 0l0 28.799988l-50.671875 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m1156.1908 674.91077l240.85034 0l0 138.86615l-240.85034 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1156.1908 674.91077l240.85034 0l0 138.86615l-240.85034 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1232.5886 685.2242l88.05469 0l0 27.597656l-88.05469 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m1234.3542 706.95074l0 -17.1875l3.46875 0l0 6.765625l6.796875 0l0 -6.765625l3.46875 0l0 17.1875l-3.46875 0l0 -7.515625l-6.796875 0l0 7.515625l-3.46875 0zm24.503906 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm9.097656 7.296875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.9492188 -12.453125l3.03125 0l0 1.703125q1.625 -1.984375 3.875 -1.984375q1.203125 0 2.078125 0.5q0.875 0.484375 1.4375 1.484375q0.828125 -1.0 1.765625 -1.484375q0.953125 -0.5 2.03125 -0.5q1.375 0 2.3125 0.5625q0.953125 0.5625 1.421875 1.640625q0.34375 0.796875 0.34375 2.578125l0 7.953125l-3.296875 0l0 -7.109375q0 -1.859375 -0.328125 -2.390625q-0.46875 -0.703125 -1.40625 -0.703125q-0.703125 0 -1.3125 0.421875q-0.609375 0.421875 -0.875 1.234375q-0.265625 0.8125 -0.265625 2.5625l0 5.984375l-3.296875 0l0 -6.828125q0 -1.8125 -0.171875 -2.328125q-0.171875 -0.53125 -0.546875 -0.78125q-0.375 -0.265625 -1.0 -0.265625q-0.765625 0 -1.375 0.40625q-0.609375 0.40625 -0.875 1.1875q-0.265625 0.765625 -0.265625 2.5625l0 6.046875l-3.28125 0l0 -12.453125zm28.792969 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm4.7851562 3.75l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1320.6433 685.2242l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m1232.5886 708.51074l88.05469 0l0 2.1600342l-88.05469 0l0 -2.1600342z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/hermes/README.md&sa=D&source=editors&ust=1638577908215000&usg=AOvVaw0pm3C9IcD3P84ALeLgB-sr" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1232.5886 683.91077l88.05469 0l0 28.799988l-88.05469 0l0 -28.799988z" fill-rule="nonzero"/></a><defs><linearGradient id="p.3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.216496493233654 0.0 0.0 14.216496493233654 0.0 0.0)" spreadMethod="pad" x1="99.85085736086143" y1="40.61493112550267" x2="89.79836859699044" y2="30.56225774006074"><stop offset="0.0" stop-color="#8e7cc3"/><stop offset="0.47" stop-color="#b4a7d6"/><stop offset="0.54" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.3)" d="m1156.1908 554.9134l240.85034 0l0 44.97638l-240.85034 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1156.1908 554.9134l240.85034 0l0 44.97638l-240.85034 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1177.575 564.5701l125.390625 0l0 13.798828l-125.390625 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m1182.4343 573.15216l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.9375 2.28125l0 -8.59375l1.046875 0l0 3.078125q0.734375 -0.84375 1.859375 -0.84375q0.703125 0 1.203125 0.28125q0.515625 0.265625 0.734375 0.75q0.21875 0.46875 0.21875 1.390625l0 3.9375l-1.046875 0l0 -3.9375q0 -0.796875 -0.34375 -1.15625q-0.34375 -0.359375 -0.96875 -0.359375q-0.46875 0 -0.890625 0.25q-0.40625 0.234375 -0.59375 0.65625q-0.171875 0.40625 -0.171875 1.140625l0 3.40625l-1.046875 0zm6.658203 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.6210938 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.246094 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.486328 0.59375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.564453 1.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm5.625 2.0l2.484375 -8.875l0.84375 0l-2.484375 8.875l-0.84375 0zm8.162109 -0.140625l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm6.939453 3.109375l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm9.798828 3.15625l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.1738281 -1.859375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm5.625 2.0l2.484375 -8.875l0.84375 0l-2.484375 8.875l-0.84375 0zm4.1308594 -0.140625l0 -8.59375l1.046875 0l0 3.078125q0.734375 -0.84375 1.859375 -0.84375q0.703125 0 1.203125 0.28125q0.515625 0.265625 0.734375 0.75q0.21875 0.46875 0.21875 1.390625l0 3.9375l-1.046875 0l0 -3.9375q0 -0.796875 -0.34375 -1.15625q-0.34375 -0.359375 -0.96875 -0.359375q-0.46875 0 -0.890625 0.25q-0.40625 0.234375 -0.59375 0.65625q-0.171875 0.40625 -0.171875 1.140625l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.0117188 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.246094 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000000" d="m1307.2214 575.4334l0 -8.59375l2.96875 0q1.0 0 1.53125 0.125q0.734375 0.171875 1.25 0.609375q0.6875 0.578125 1.015625 1.484375q0.34375 0.890625 0.34375 2.03125q0 0.984375 -0.234375 1.734375q-0.21875 0.75 -0.578125 1.25q-0.359375 0.5 -0.796875 0.78125q-0.421875 0.28125 -1.015625 0.4375q-0.59375 0.140625 -1.375 0.140625l-3.109375 0zm1.140625 -1.015625l1.828125 0q0.859375 0 1.34375 -0.15625q0.484375 -0.15625 0.765625 -0.453125q0.40625 -0.390625 0.625 -1.078125q0.234375 -0.6875 0.234375 -1.65625q0 -1.34375 -0.453125 -2.0625q-0.4375 -0.734375 -1.0625 -0.984375q-0.46875 -0.171875 -1.46875 -0.171875l-1.8125 0l0 6.5625zm7.4785156 1.015625l0 -8.59375l3.234375 0q0.984375 0 1.578125 0.265625q0.59375 0.265625 0.921875 0.8125q0.34375 0.53125 0.34375 1.125q0 0.546875 -0.296875 1.03125q-0.296875 0.484375 -0.90625 0.78125q0.78125 0.234375 1.1875 0.796875q0.421875 0.546875 0.421875 1.296875q0 0.59375 -0.25 1.125q-0.25 0.515625 -0.625 0.796875q-0.375 0.28125 -0.953125 0.421875q-0.5625 0.140625 -1.375 0.140625l-3.28125 0zm1.140625 -4.984375l1.859375 0q0.75 0 1.078125 -0.09375q0.4375 -0.125 0.65625 -0.421875q0.21875 -0.3125 0.21875 -0.765625q0 -0.421875 -0.203125 -0.75q-0.203125 -0.328125 -0.59375 -0.4375q-0.375 -0.125 -1.296875 -0.125l-1.71875 0l0 2.59375zm0 3.96875l2.140625 0q0.546875 0 0.765625 -0.046875q0.40625 -0.0625 0.65625 -0.21875q0.265625 -0.171875 0.4375 -0.484375q0.171875 -0.3125 0.171875 -0.71875q0 -0.484375 -0.25 -0.84375q-0.234375 -0.359375 -0.671875 -0.5q-0.4375 -0.140625 -1.265625 -0.140625l-1.984375 0l0 2.953125zm10.863281 1.015625l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.1738281 -1.859375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm16.021484 -1.15625l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.3691406 3.015625l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm2.6972656 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.9160156 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm8.970703 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6152344 -0.921875l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000099" d="m1177.575 576.2134l125.390625 0l0 1.0800171l-125.390625 0l0 -1.0800171z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/dbus/hermes/&sa=D&source=editors&ust=1638577908219000&usg=AOvVaw2ujobYXoJulWxne0OMffYI" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1177.575 563.9134l125.390625 0l0 14.400024l-125.390625 0l0 -14.400024z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m704.0971 633.55914l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l125.64807 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.991333 0.99139404 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194946 -2.3666992 5.286194 -5.286194 5.286194l-125.64807 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m704.0971 633.55914l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l125.64807 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.991333 0.99139404 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194946 -2.3666992 5.286194 -5.286194 5.286194l-125.64807 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286194z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m744.80914 636.86566l49.60962 0l0 15.325989l-49.60962 0l0 -15.325989z" fill-rule="nonzero"/><path fill="#000099" d="m745.9654 648.9312l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.406128 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9923706 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9454346 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm11.383667 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.093811 0.109375l-0.18756104 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.406128 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.4923706 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 3.46875l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm11.430542 0l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0z" fill-rule="nonzero"/><path fill="#000000" d="m794.84064 641.13434l0.296875 -0.921875q1.03125 0.375 1.5 0.640625q-0.125 -1.1875 -0.125 -1.625l0.9375 0q-0.015625 0.640625 -0.140625 1.609375q0.65625 -0.328125 1.53125 -0.625l0.296875 0.921875q-0.828125 0.28125 -1.625 0.375q0.40625 0.34375 1.125 1.21875l-0.78125 0.5625q-0.375 -0.515625 -0.890625 -1.40625q-0.484375 0.921875 -0.84375 1.40625l-0.765625 -0.5625q0.75 -0.921875 1.078125 -1.21875q-0.84375 -0.171875 -1.59375 -0.375z" fill-rule="nonzero"/><path fill="#000099" d="m744.80914 649.7979l49.60962 0l0 1.2000122l-49.60962 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/doc/manager-api.txt?q%3Dmanager-api.txt%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908221000&usg=AOvVaw0tDQt2hh5bFGWyCKJJIcyj" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m744.80914 636.1312l49.60962 0l0 16.0l-49.60962 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1156.1908 478.6614l240.85034 0l0 59.716522l-240.85034 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1156.1908 478.6614l240.85034 0l0 59.716522l-240.85034 0z" fill-rule="evenodd"/><path fill="#000000" d="m1237.9949 499.0058l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.8828125 1.34375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8046875 4.953125l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.0 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.6875 1.015625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.8203125 1.265625l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4609375 3.1875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375z" fill-rule="nonzero"/><defs><linearGradient id="p.4" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.461889909062105 0.0 0.0 14.461889909062105 0.0 0.0)" spreadMethod="pad" x1="79.93039935274531" y1="21.668886568203416" x2="69.70439250989592" y2="11.442692564966935"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.4)" d="m878.9525 300.8479l0 0c0 -3.4587402 2.803833 -6.2626038 6.2625732 -6.2626038l245.67957 0c1.6608887 0 3.2537842 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342285 2.7673645 1.8342285 4.428314l0 25.049622c0 3.4587097 -2.803833 6.2625732 -6.2625732 6.2625732l-245.67957 0c-3.4587402 0 -6.2625732 -2.8038635 -6.2625732 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m878.9525 300.8479l0 0c0 -3.4587402 2.803833 -6.2626038 6.2625732 -6.2626038l245.67957 0c1.6608887 0 3.2537842 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342285 2.7673645 1.8342285 4.428314l0 25.049622c0 3.4587097 -2.803833 6.2625732 -6.2625732 6.2625732l-245.67957 0c-3.4587402 0 -6.2625732 -2.8038635 -6.2625732 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m910.274 306.15396l195.5617 0l0 15.32605l-195.5617 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m915.6646 315.6883l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0164795 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836853 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374817 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm2.421753 1.046875l-2.125 -6.90625l1.21875 0l1.09375 3.984375l0.421875 1.484375q0.015625 -0.109375 0.359375 -1.421875l1.09375 -4.046875l1.203125 0l1.03125 4.0l0.34375 1.328125l0.40625 -1.34375l1.171875 -3.984375l1.140625 0l-2.15625 6.90625l-1.21875 0l-1.09375 -4.140625l-0.265625 -1.171875l-1.40625 5.3125l-1.21875 0zm7.906433 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4696045 0l0 -9.546875l1.171875 0l0 5.453125l2.765625 -2.8125l1.515625 0l-2.640625 2.5625l2.90625 4.34375l-1.4375 0l-2.28125 -3.53125l-0.828125 0.796875l0 2.734375l-1.171875 0zm5.5703125 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm13.006226 -5.1875l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm7.6937256 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.437378 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.7266846 0.578125l1.140625 0.15625q0.078125 0.53125 0.40625 0.78125q0.4375 0.3125 1.1875 0.3125q0.8125 0 1.25 -0.328125q0.453125 -0.3125 0.609375 -0.90625q0.09375 -0.359375 0.078125 -1.5q-0.765625 0.90625 -1.90625 0.90625q-1.4375 0 -2.21875 -1.03125q-0.78125 -1.03125 -0.78125 -2.46875q0 -0.984375 0.359375 -1.8125q0.359375 -0.84375 1.03125 -1.296875q0.6875 -0.453125 1.609375 -0.453125q1.21875 0 2.015625 0.984375l0 -0.828125l1.078125 0l0 5.96875q0 1.609375 -0.328125 2.28125q-0.328125 0.6875 -1.046875 1.078125q-0.703125 0.390625 -1.75 0.390625q-1.234375 0 -2.0 -0.5625q-0.75 -0.5625 -0.734375 -1.671875zm0.984375 -4.15625q0 1.359375 0.53125 1.984375q0.546875 0.625 1.359375 0.625q0.796875 0 1.34375 -0.625q0.546875 -0.625 0.546875 -1.953125q0 -1.265625 -0.5625 -1.90625q-0.5625 -0.640625 -1.359375 -0.640625q-0.765625 0 -1.3125 0.640625q-0.546875 0.625 -0.546875 1.875zm6.9749756 3.578125l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0079346 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1105.8357 306.15396l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m910.274 319.0862l195.5617 0l0 1.2000122l-195.5617 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/services/network_config/public/mojom/cros_network_config.mojom?q%3Dchromeos.network_config.mojom%2520%26ss%3Dchromium&sa=D&source=editors&ust=1638577908228000&usg=AOvVaw1Ze-2zSCqY2-wFonj4JQiW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m910.274 305.41956l195.5617 0l0 16.0l-195.5617 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m958.3438 1280.937l498.48822 0l0 101.03931l-498.48822 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m958.3438 1280.937l498.48822 0l0 101.03931l-498.48822 0z" fill-rule="evenodd"/><path fill="#000000" d="m978.31256 1333.6892l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.363586 1.578125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1448364 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519775 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.0007324 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504211 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm11.567871 0l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm14.7751465 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563232 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.020874 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292725 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.322021 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004272 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881104 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853394 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m1224.6273 1296.9528l175.9685 0l0 69.00781l-175.9685 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1224.6273 1296.9528l175.9685 0l0 69.00781l-175.9685 0z" fill-rule="evenodd"/><path fill="#000000" d="m1234.4711 1319.5759l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm13.3342285 4.296875l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.8394775 0l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm30.302246 -4.6875l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.051025 3.5q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.494019 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm13.230835 5.0625l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0zm18.225952 -3.34375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm18.110107 -7.59375l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.0042725 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm14.417603 -4.6875l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm13.473022 0l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875z" fill-rule="nonzero"/><path fill="#dd7e6b" d="m610.7297 966.22046l258.2047 0l0 101.03943l-258.2047 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m610.7297 966.22046l258.2047 0l0 101.03943l-258.2047 0z" fill-rule="evenodd"/><path fill="#000000" d="m697.98114 991.6717l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm10.375732 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1291504 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.4939575 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm7.7663574 8.53125l0 -1.1875l10.859375 0l0 1.1875l-10.859375 0zm11.891296 0l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203857 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.8063965 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5270996 5.1875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.171875 -3.484375l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m669.8574 998.25146l139.94922 0l0 21.45288l-139.94922 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m672.99805 1015.14044l-3.0625 -9.671875l2.484375 0l1.8125 6.34375l1.671875 -6.34375l2.46875 0l1.609375 6.34375l1.859375 -6.34375l2.515625 0l-3.109375 9.671875l-2.453125 0l-1.671875 -6.21875l-1.640625 6.21875l-2.484375 0zm12.636414 -9.671875l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm10.849121 -1.71875l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm3.5319824 8.328125l0 -1.65625l10.640625 0l0 1.65625l-10.640625 0zm10.985046 -6.453125l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm17.641357 2.765625l0 -1.453125q-0.53125 0.78125 -1.390625 1.234375q-0.859375 0.4375 -1.8125 0.4375q-0.96875 0 -1.75 -0.421875q-0.765625 -0.4375 -1.125 -1.203125q-0.34375 -0.78125 -0.34375 -2.140625l0 -6.125l2.5625 0l0 4.4375q0 2.046875 0.140625 2.515625q0.140625 0.453125 0.515625 0.71875q0.375 0.265625 0.953125 0.265625q0.65625 0 1.171875 -0.359375q0.515625 -0.359375 0.703125 -0.890625q0.203125 -0.53125 0.203125 -2.609375l0 -4.078125l2.546875 0l0 9.671875l-2.375 0zm4.958496 -9.671875l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm8.864746 -4.671875l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm8.94281 5.0l0 -13.359375l2.5625 0l0 13.359375l-2.5625 0zm5.1833496 -10.984375l0 -2.375l2.5625 0l0 2.375l-2.5625 0zm0 10.984375l0 -9.671875l2.5625 0l0 9.671875l-2.5625 0zm13.620789 -6.8125l-2.53125 0.453125q-0.125 -0.75 -0.578125 -1.125q-0.453125 -0.390625 -1.171875 -0.390625q-0.953125 0 -1.53125 0.65625q-0.5625 0.65625 -0.5625 2.203125q0 1.734375 0.578125 2.4375q0.578125 0.703125 1.546875 0.703125q0.734375 0 1.203125 -0.40625q0.46875 -0.421875 0.65625 -1.421875l2.515625 0.421875q-0.390625 1.734375 -1.515625 2.625q-1.109375 0.875 -2.96875 0.875q-2.125 0 -3.390625 -1.328125q-1.25 -1.34375 -1.25 -3.71875q0 -2.390625 1.265625 -3.71875q1.265625 -1.34375 3.421875 -1.34375q1.765625 0 2.796875 0.765625q1.046875 0.75 1.515625 2.3125zm3.8444824 0.09375l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm13.844421 4.640625l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm7.036621 -9.671875l0 2.03125l-1.75 0l0 3.90625q0 1.1875 0.046875 1.390625q0.046875 0.1875 0.21875 0.3125q0.1875 0.125 0.4375 0.125q0.359375 0 1.03125 -0.25l0.21875 2.0q-0.890625 0.375 -2.015625 0.375q-0.703125 0 -1.265625 -0.234375q-0.546875 -0.234375 -0.8125 -0.59375q-0.25 -0.375 -0.34375 -1.0q-0.09375 -0.453125 -0.09375 -1.8125l0 -4.21875l-1.171875 0l0 -2.03125l1.171875 0l0 -1.921875l2.578125 -1.5l0 3.421875l1.75 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m809.80664 998.25146l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m669.8574 1016.3538l139.94922 0l0 1.6799927l-139.94922 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/third_party/wpa_supplicant/wpa_supplicant/?q%3Dwpa_supplicant&sa=D&source=editors&ust=1638577908238000&usg=AOvVaw2UhcCz4DmA_EaO4q2tEFM1" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m669.8574 997.22046l139.94922 0l0 22.400024l-139.94922 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m632.48425 918.68646l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l191.88428 0c1.4020386 0 2.746582 0.5569458 3.737915 1.5482788c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286194 5.286194l-191.88428 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m632.48425 918.68646l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l191.88428 0c1.4020386 0 2.746582 0.5569458 3.737915 1.5482788c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286194 5.286194l-191.88428 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path fill="#000000" d="m651.04364 935.46857l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0839844 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.9628906 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm4.1777344 0l-1.90625 -6.21875l1.09375 0l0.984375 3.59375l0.375 1.328125q0.03125 -0.09375 0.328125 -1.28125l0.984375 -3.640625l1.078125 0l0.9375 3.609375l0.3125 1.1875l0.359375 -1.203125l1.0625 -3.59375l1.03125 0l-1.953125 6.21875l-1.09375 0l-0.984375 -3.734375l-0.25 -1.046875l-1.25 4.78125l-1.109375 0zm11.197266 0l-1.046875 0l0 -6.71875q-0.390625 0.359375 -1.015625 0.734375q-0.609375 0.359375 -1.09375 0.53125l0 -1.015625q0.875 -0.421875 1.53125 -1.0q0.671875 -0.59375 0.953125 -1.15625l0.671875 0l0 8.625zm3.2988281 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm4.1777344 0l-1.90625 -6.21875l1.09375 0l0.984375 3.59375l0.375 1.328125q0.03125 -0.09375 0.328125 -1.28125l0.984375 -3.640625l1.078125 0l0.9375 3.609375l0.3125 1.1875l0.359375 -1.203125l1.0625 -3.59375l1.03125 0l-1.953125 6.21875l-1.09375 0l-0.984375 -3.734375l-0.25 -1.046875l-1.25 4.78125l-1.109375 0zm7.5253906 2.390625l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.783203 2.3125q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm1.7207031 5.515625l0 -0.765625l7.0 0l0 0.765625l-7.0 0zm7.236328 -4.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm10.5 1.859375l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.5957031 2.390625l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm5.720703 5.46875l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm5.689453 3.078125l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm2.6972656 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.7285156 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm6.0 1.515625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm8.970703 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm4.7089844 0.9375l-1.046875 0l0 -6.71875q-0.390625 0.359375 -1.015625 0.734375q-0.609375 0.359375 -1.09375 0.53125l0 -1.015625q0.875 -0.421875 1.53125 -1.0q0.671875 -0.59375 0.953125 -1.15625l0.671875 0l0 8.625zm3.2988281 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3652344 0l0 -8.59375l1.125 0l0 8.59375l-1.125 0zm3.0058594 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm8.970703 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm5.2871094 -1.0625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2617188 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm7.1464844 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm6.767578 0.84375l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm6.1875 0.28125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m920.18243 920.23895l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l200.60864 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.9914551 0.991333 1.5483398 2.3359375 1.5483398 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286255 5.286194l-200.60864 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m920.18243 920.23895l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l200.60864 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.9914551 0.991333 1.5483398 2.3359375 1.5483398 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286255 5.286194l-200.60864 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path fill="#000000" d="m935.7954 933.9117q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.8085938 0.515625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm6.298828 3.21875l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.2871094 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0683594 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.261719 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm10.126953 1.703125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.908203 3.703125l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm10.220703 1.109375l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm6.421875 1.859375l0 -8.59375l1.0625 0l0 4.90625l2.484375 -2.53125l1.375 0l-2.390625 2.296875l2.625 3.921875l-1.296875 0l-2.0625 -3.1875l-0.734375 0.71875l0 2.46875l-1.0625 0zm8.296875 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 5.5l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm6.017578 3.078125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.1308594 0l0 -8.59375l1.71875 0l2.03125 6.078125q0.28125 0.859375 0.40625 1.28125q0.140625 -0.46875 0.453125 -1.375l2.0625 -5.984375l1.53125 0l0 8.59375l-1.09375 0l0 -7.1875l-2.5 7.1875l-1.03125 0l-2.484375 -7.3125l0 7.3125l-1.09375 0zm9.511719 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm10.017578 3.109375l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm10.220703 1.109375l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm10.089844 0l0 -8.59375l1.71875 0l2.03125 6.078125q0.28125 0.859375 0.40625 1.28125q0.140625 -0.46875 0.453125 -1.375l2.0625 -5.984375l1.53125 0l0 8.59375l-1.09375 0l0 -7.1875l-2.5 7.1875l-1.03125 0l-2.484375 -7.3125l0 7.3125l-1.09375 0zm13.964844 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.736328 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.5019531 3.640625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.251953 1.21875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm7.6835938 0l-1.046875 0l0 -6.71875q-0.390625 0.359375 -1.015625 0.734375q-0.609375 0.359375 -1.09375 0.53125l0 -1.015625q0.875 -0.421875 1.53125 -1.0q0.671875 -0.59375 0.953125 -1.15625l0.671875 0l0 8.625z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m940.31494 1026.2362l175.9685 0l0 37.57483l-175.9685 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m940.31494 1026.2362l175.9685 0l0 37.57483l-175.9685 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m996.16547 1036.2672l64.26752 0l0 21.45288l-64.26752 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m997.35297 1053.1562l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1917114 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6447754 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.891357 4.90625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.040771 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.891357 -6.5625l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448975 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1060.433 1036.2672l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m996.16547 1054.3695l64.26752 0l0 1.6800537l-64.26752 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://docs.google.com/drawings/d/1uGg3EKV0wzma3FBQm94c45M2xV0tmQcNdbtygUnOjlI/edit&sa=D&source=editors&ust=1638577908247000&usg=AOvVaw1gEjzvFhCE0y__YdgilinR" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m996.16547 1035.2362l64.26752 0l0 22.400024l-64.26752 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m1138.7454 1026.2362l152.25195 0l0 37.57483l-152.25195 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1138.7454 1026.2362l152.25195 0l0 37.57483l-152.25195 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1190.508 1036.2672l48.726685 0l0 21.45288l-48.726685 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1191.6956 1053.1562l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1916504 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448975 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm15.047485 8.609375l0 -4.734375q-0.375 0.546875 -1.0625 0.90625q-0.6875 0.34375 -1.46875 0.34375q-1.71875 0 -2.96875 -1.375q-1.234375 -1.375 -1.234375 -3.765625q0 -1.46875 0.5 -2.625q0.515625 -1.15625 1.46875 -1.75q0.96875 -0.59375 2.109375 -0.59375q1.796875 0 2.828125 1.515625l0 -1.296875l1.46875 0l0 13.375l-1.640625 0zm-5.046875 -8.5625q0 1.859375 0.78125 2.796875q0.78125 0.9375 1.875 0.9375q1.046875 0 1.796875 -0.890625q0.765625 -0.890625 0.765625 -2.703125q0 -1.9375 -0.796875 -2.90625q-0.796875 -0.96875 -1.875 -0.96875q-1.0625 0 -1.8125 0.90625q-0.734375 0.90625 -0.734375 2.828125zm9.266357 4.859375l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm15.540894 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1239.2347 1036.2672l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1190.508 1054.3695l48.726685 0l0 1.6800537l-48.726685 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://docs.google.com/drawings/d/1uGg3EKV0wzma3FBQm94c45M2xV0tmQcNdbtygUnOjlI/edit&sa=D&source=editors&ust=1638577908249000&usg=AOvVaw2jAXNQ6dTte6AmOn4yceh2" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1190.508 1035.2362l48.726685 0l0 22.400024l-48.726685 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1098.7843 229.11023l498.48828 0l0 37.5748l-498.48828 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1098.7843 229.11023l498.48828 0l0 37.5748l-498.48828 0z" fill-rule="evenodd"/><path fill="#000000" d="m1263.9747 246.86461l1.0625 -0.09375q0.078125 0.65625 0.359375 1.0625q0.28125 0.40625 0.859375 0.671875q0.59375 0.25 1.328125 0.25q0.640625 0 1.140625 -0.1875q0.5 -0.203125 0.734375 -0.53125q0.25 -0.34375 0.25 -0.734375q0 -0.40625 -0.234375 -0.703125q-0.234375 -0.3125 -0.765625 -0.515625q-0.359375 -0.140625 -1.546875 -0.421875q-1.171875 -0.28125 -1.640625 -0.53125q-0.625 -0.328125 -0.921875 -0.796875q-0.296875 -0.484375 -0.296875 -1.078125q0 -0.640625 0.359375 -1.203125q0.375 -0.578125 1.078125 -0.859375q0.71875 -0.296875 1.578125 -0.296875q0.953125 0 1.6875 0.3125q0.734375 0.296875 1.125 0.90625q0.390625 0.59375 0.421875 1.34375l-1.09375 0.078125q-0.09375 -0.8125 -0.609375 -1.21875q-0.5 -0.421875 -1.484375 -0.421875q-1.03125 0 -1.5 0.375q-0.46875 0.375 -0.46875 0.90625q0 0.46875 0.328125 0.765625q0.328125 0.296875 1.703125 0.609375q1.390625 0.3125 1.90625 0.546875q0.75 0.359375 1.109375 0.890625q0.359375 0.515625 0.359375 1.21875q0 0.6875 -0.390625 1.296875q-0.390625 0.59375 -1.125 0.9375q-0.734375 0.328125 -1.65625 0.328125q-1.171875 0 -1.96875 -0.328125q-0.78125 -0.34375 -1.234375 -1.03125q-0.4375 -0.6875 -0.453125 -1.546875zm12.503906 0.765625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm8.173828 2.765625l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm3.3339844 0l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6660156 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.470703 0.515625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm5.580078 1.359375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm14.662109 0.84375q-0.515625 0.578125 -1.140625 0.875q-0.609375 0.28125 -1.328125 0.28125q-1.3125 0 -2.09375 -0.890625q-0.625 -0.71875 -0.625 -1.625q0 -0.796875 0.515625 -1.4375q0.515625 -0.640625 1.53125 -1.125q-0.578125 -0.671875 -0.78125 -1.078125q-0.1875 -0.421875 -0.1875 -0.8125q0 -0.765625 0.609375 -1.328125q0.609375 -0.578125 1.53125 -0.578125q0.875 0 1.421875 0.546875q0.5625 0.53125 0.5625 1.28125q0 1.234375 -1.609375 2.09375l1.53125 1.96875q0.265625 -0.515625 0.40625 -1.203125l1.109375 0.234375q-0.28125 1.125 -0.765625 1.859375q0.59375 0.78125 1.34375 1.3125l-0.71875 0.84375q-0.640625 -0.421875 -1.3125 -1.21875zm-2.140625 -4.46875q0.6875 -0.40625 0.875 -0.703125q0.203125 -0.3125 0.203125 -0.6875q0 -0.4375 -0.28125 -0.71875q-0.265625 -0.28125 -0.6875 -0.28125q-0.421875 0 -0.71875 0.28125q-0.28125 0.28125 -0.28125 0.671875q0 0.203125 0.109375 0.421875q0.109375 0.21875 0.3125 0.46875l0.46875 0.546875zm1.484375 3.640625l-1.9375 -2.40625q-0.859375 0.515625 -1.15625 0.953125q-0.296875 0.4375 -0.296875 0.859375q0 0.53125 0.40625 1.09375q0.421875 0.5625 1.1875 0.5625q0.46875 0 0.96875 -0.296875q0.515625 -0.296875 0.828125 -0.765625zm13.353516 -1.171875l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.923828 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0839844 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.4628906 0.515625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.080078 3.21875l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.5800781 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.074219 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm5.001953 2.1875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm11.6328125 0l-2.28125 -8.59375l1.171875 0l1.3125 5.640625q0.203125 0.875 0.359375 1.75q0.328125 -1.375 0.390625 -1.59375l1.625 -5.796875l1.375 0l1.234375 4.34375q0.453125 1.625 0.671875 3.046875q0.15625 -0.8125 0.421875 -1.875l1.34375 -5.515625l1.140625 0l-2.34375 8.59375l-1.109375 0l-1.796875 -6.546875q-0.234375 -0.8125 -0.28125 -1.0q-0.125 0.578125 -0.25 1.0l-1.8125 6.546875l-1.171875 0zm13.734375 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.845703 3.703125l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm11.486328 -5.4375l1.140625 0l0 4.96875q0 1.296875 -0.296875 2.0625q-0.296875 0.75 -1.0625 1.234375q-0.765625 0.46875 -2.0 0.46875q-1.203125 0 -1.984375 -0.40625q-0.765625 -0.421875 -1.09375 -1.203125q-0.328125 -0.796875 -0.328125 -2.15625l0 -4.96875l1.140625 0l0 4.953125q0 1.125 0.203125 1.65625q0.21875 0.53125 0.71875 0.828125q0.515625 0.28125 1.25 0.28125q1.25 0 1.78125 -0.5625q0.53125 -0.578125 0.53125 -2.203125l0 -4.953125zm3.2285156 8.59375l0 -8.59375l1.125 0l0 8.59375l-1.125 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m878.19977 230.4147l171.05511 0l0 37.5748l-171.05511 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m878.19977 230.4147l171.05511 0l0 37.5748l-171.05511 0z" fill-rule="evenodd"/><path fill="#000000" d="m923.26733 248.16907l1.0625 -0.09375q0.078125 0.65625 0.359375 1.0625q0.28125 0.40625 0.859375 0.671875q0.59375 0.25 1.328125 0.25q0.640625 0 1.140625 -0.1875q0.5 -0.203125 0.734375 -0.53125q0.25 -0.34375 0.25 -0.734375q0 -0.40625 -0.234375 -0.703125q-0.234375 -0.3125 -0.765625 -0.515625q-0.359375 -0.140625 -1.546875 -0.421875q-1.171875 -0.28125 -1.640625 -0.53125q-0.625 -0.328125 -0.921875 -0.796875q-0.296875 -0.484375 -0.296875 -1.078125q0 -0.640625 0.359375 -1.203125q0.375 -0.578125 1.078125 -0.859375q0.71875 -0.296875 1.578125 -0.296875q0.953125 0 1.6875 0.3125q0.734375 0.296875 1.125 0.90625q0.390625 0.59375 0.421875 1.34375l-1.09375 0.078125q-0.09375 -0.8125 -0.609375 -1.21875q-0.5 -0.421875 -1.484375 -0.421875q-1.03125 0 -1.5 0.375q-0.46875 0.375 -0.46875 0.90625q0 0.46875 0.328125 0.765625q0.328125 0.296875 1.703125 0.609375q1.390625 0.3125 1.90625 0.546875q0.75 0.359375 1.109375 0.890625q0.359375 0.515625 0.359375 1.21875q0 0.6875 -0.390625 1.296875q-0.390625 0.59375 -1.125 0.9375q-0.734375 0.328125 -1.65625 0.328125q-1.171875 0 -1.96875 -0.328125q-0.78125 -0.34375 -1.234375 -1.03125q-0.4375 -0.6875 -0.453125 -1.546875zm8.207031 5.15625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm5.625 -4.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm8.71875 0.921875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm5.2871094 -1.0625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm15.425781 0l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.5566406 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.074219 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.6582031 5.515625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm15.146484 -10.984375l1.140625 0l0 4.96875q0 1.296875 -0.296875 2.0625q-0.296875 0.75 -1.0625 1.234375q-0.765625 0.46875 -2.0 0.46875q-1.203125 0 -1.984375 -0.40625q-0.765625 -0.421875 -1.09375 -1.203125q-0.328125 -0.796875 -0.328125 -2.15625l0 -4.96875l1.140625 0l0 4.953125q0 1.125 0.203125 1.65625q0.21875 0.53125 0.71875 0.828125q0.515625 0.28125 1.25 0.28125q1.25 0 1.78125 -0.5625q0.53125 -0.578125 0.53125 -2.203125l0 -4.953125zm3.2285156 8.59375l0 -8.59375l1.125 0l0 8.59375l-1.125 0z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m1234.0027 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l74.65588 0c1.4019775 0 2.746582 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5483398 2.3358765 1.5483398 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286255 5.286194l-74.65588 0l0 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1234.0027 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l74.65588 0c1.4019775 0 2.746582 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5483398 2.3358765 1.5483398 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286255 5.286194l-74.65588 0l0 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path fill="#000000" d="m1249.907 649.74884l0 -9.546875l1.265625 0l0 3.921875l4.953125 0l0 -3.921875l1.265625 0l0 9.546875l-1.265625 0l0 -4.5l-4.953125 0l0 4.5l-1.265625 0zm14.171997 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4541016 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0531006 2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm2.921753 -7.796875l0.296875 -0.921875q1.03125 0.375 1.5 0.640625q-0.125 -1.1875 -0.125 -1.625l0.9375 0q-0.015625 0.640625 -0.140625 1.609375q0.65625 -0.328125 1.53125 -0.625l0.296875 0.921875q-0.828125 0.28125 -1.625 0.375q0.40625 0.34375 1.125 1.21875l-0.78125 0.5625q-0.375 -0.515625 -0.890625 -1.40625q-0.484375 0.921875 -0.84375 1.40625l-0.765625 -0.5625q0.75 -0.921875 1.078125 -1.21875q-0.84375 -0.171875 -1.59375 -0.375z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m496.78195 230.74278l171.05515 0l0 37.574814l-171.05515 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m496.78195 230.74278l171.05515 0l0 37.574814l-171.05515 0z" fill-rule="evenodd"/><path fill="#000000" d="m534.2685 251.26279l0 -8.59375l5.796875 0l0 1.015625l-4.65625 0l0 2.65625l4.03125 0l0 1.015625l-4.03125 0l0 3.90625l-1.140625 0zm11.392578 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm10.126953 1.703125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.908203 3.703125l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm6.939453 3.109375l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm9.783203 2.390625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm6.767578 0.84375l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.9375 2.28125l0 -8.59375l1.0625 0l0 4.90625l2.484375 -2.53125l1.375 0l-2.390625 2.296875l2.625 3.921875l-1.296875 0l-2.0625 -3.1875l-0.734375 0.71875l0 2.46875l-1.0625 0zm9.474609 0l0 -8.59375l3.8125 0q1.15625 0 1.75 0.234375q0.59375 0.234375 0.953125 0.828125q0.359375 0.578125 0.359375 1.28125q0 0.921875 -0.59375 1.546875q-0.59375 0.625 -1.828125 0.796875q0.453125 0.21875 0.6875 0.421875q0.5 0.453125 0.9375 1.140625l1.5 2.34375l-1.4375 0l-1.125 -1.78125q-0.5 -0.78125 -0.828125 -1.1875q-0.3125 -0.40625 -0.578125 -0.5625q-0.25 -0.171875 -0.515625 -0.25q-0.1875 -0.03125 -0.625 -0.03125l-1.328125 0l0 3.8125l-1.140625 0zm1.140625 -4.796875l2.453125 0q0.765625 0 1.203125 -0.15625q0.453125 -0.171875 0.671875 -0.515625q0.234375 -0.359375 0.234375 -0.78125q0 -0.609375 -0.453125 -1.0q-0.4375 -0.390625 -1.390625 -0.390625l-2.71875 0l0 2.84375zm11.634766 2.796875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 6.09375l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm5.330078 -0.03125q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6152344 -0.921875l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><defs><linearGradient id="p.5" gradientUnits="userSpaceOnUse" gradientTransform="matrix(13.81608296015827 0.0 0.0 13.81608296015827 0.0 0.0)" spreadMethod="pad" x1="58.502680497066756" y1="22.681664627686473" x2="48.733326564729104" y2="12.912126659763194"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.5)" d="m557.11255 300.8466l0 0c0 -3.4587402 2.803894 -6.2626038 6.2626343 -6.2626038l219.85272 0c1.6609497 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342896 2.7673645 1.8342896 4.428314l0 25.049622c0 3.4587097 -2.803894 6.2625732 -6.2626343 6.2625732l-219.85272 0c-3.4587402 0 -6.2626343 -2.8038635 -6.2626343 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m557.11255 300.8466l0 0c0 -3.4587402 2.803894 -6.2626038 6.2626343 -6.2626038l219.85272 0c1.6609497 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342896 2.7673645 1.8342896 4.428314l0 25.049622c0 3.4587097 -2.803894 6.2625732 -6.2626343 6.2625732l-219.85272 0c-3.4587402 0 -6.2626343 -2.8038635 -6.2626343 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m575.1465 306.15265l196.31012 0l0 15.32605l-196.31012 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m580.5371 315.68698l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0164795 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm2.421753 1.046875l-2.125 -6.90625l1.21875 0l1.09375 3.984375l0.421875 1.484375q0.015625 -0.109375 0.359375 -1.421875l1.09375 -4.046875l1.203125 0l1.03125 4.0l0.34375 1.328125l0.40625 -1.34375l1.171875 -3.984375l1.140625 0l-2.15625 6.90625l-1.21875 0l-1.09375 -4.140625l-0.265625 -1.171875l-1.40625 5.3125l-1.21875 0zm7.906372 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4696045 0l0 -9.546875l1.171875 0l0 5.453125l2.765625 -2.8125l1.515625 0l-2.640625 2.5625l2.90625 4.34375l-1.4375 0l-2.28125 -3.53125l-0.828125 0.796875l0 2.734375l-1.171875 0zm5.5703125 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.490601 -2.65625l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 3.265625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm5.5392456 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.7406006 0l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374817 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664978 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0079346 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m771.4566 306.15265l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m575.1465 319.0849l196.31012 0l0 1.2000122l-196.31012 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/services/network_health/public/mojom/network_health.mojom;l%3D9?q%3Dnetwork_health.mojom%26sq%3D%26ss%3Dchromium&sa=D&source=editors&ust=1638577908260000&usg=AOvVaw28ybHi5HGyeCAUlmf__dTZ" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m575.1465 305.41824l196.31012 0l0 16.0l-196.31012 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1160.627 300.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1160.627 300.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1182.738 306.15396l188.15588 0l0 15.32605l-188.15588 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1188.1287 315.6883l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0166016 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm7.890503 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9610596 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5079346 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.4923096 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm3.3758545 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.021851 -4.71875l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.671753 1.046875l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8812256 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm6.6781006 3.421875l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0080566 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1370.8939 306.15396l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1182.738 319.0862l188.15588 0l0 1.2000122l-188.15588 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom?q%3Dcellular_setup.mojom%26ss%3Dchromium&sa=D&source=editors&ust=1638577908265000&usg=AOvVaw0URa34zZn9Fxpr16lgI-Ar" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1182.738 305.41956l188.15588 0l0 16.0l-188.15588 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m687.49084 230.74278l171.05511 0l0 37.574814l-171.05511 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m687.49084 230.74278l171.05511 0l0 37.574814l-171.05511 0z" fill-rule="evenodd"/><path fill="#000000" d="m735.25964 251.26279l0 -8.59375l2.96875 0q1.0 0 1.53125 0.125q0.734375 0.171875 1.25 0.609375q0.6875 0.578125 1.015625 1.484375q0.34375 0.890625 0.34375 2.03125q0 0.984375 -0.234375 1.734375q-0.21875 0.75 -0.578125 1.25q-0.359375 0.5 -0.796875 0.78125q-0.421875 0.28125 -1.015625 0.4375q-0.59375 0.140625 -1.375 0.140625l-3.109375 0zm1.140625 -1.015625l1.828125 0q0.859375 0 1.34375 -0.15625q0.484375 -0.15625 0.765625 -0.453125q0.40625 -0.390625 0.625 -1.078125q0.234375 -0.6875 0.234375 -1.65625q0 -1.34375 -0.453125 -2.0625q-0.4375 -0.734375 -1.0625 -0.984375q-0.46875 -0.171875 -1.46875 -0.171875l-1.8125 0l0 6.5625zm7.4003906 -6.359375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.7285156 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.5019531 3.640625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm6.001953 3.21875l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.283203 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.564453 1.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm8.71875 0.921875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.7285156 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.515625 0.421875l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm15.521484 -6.734375l1.140625 0l0 4.96875q0 1.296875 -0.296875 2.0625q-0.296875 0.75 -1.0625 1.234375q-0.765625 0.46875 -2.0 0.46875q-1.203125 0 -1.984375 -0.40625q-0.765625 -0.421875 -1.09375 -1.203125q-0.328125 -0.796875 -0.328125 -2.15625l0 -4.96875l1.140625 0l0 4.953125q0 1.125 0.203125 1.65625q0.21875 0.53125 0.71875 0.828125q0.515625 0.28125 1.25 0.28125q1.25 0 1.78125 -0.5625q0.53125 -0.578125 0.53125 -2.203125l0 -4.953125zm3.2285156 8.59375l0 -8.59375l1.125 0l0 8.59375l-1.125 0z" fill-rule="nonzero"/><path fill="#6d9eeb" d="m965.1916 363.38846l171.05511 0l0 93.25983l-171.05511 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m965.1916 363.38846l171.05511 0l0 93.25983l-171.05511 0z" fill-rule="evenodd"/><path fill="#000000" d="m1009.87933 383.73282l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.6171875 2.984375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015564 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.54681396 -0.296875 -0.90618896 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65618896 0.765625 1.578064 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.593689 0.84375q-0.6875 0.84375 -0.6875 2.4375zm10.695251 2.84375l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm5.8515625 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.375 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm12.453125 4.953125l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.453125 1.859375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm8.40625 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m1018.1567 406.74844l0 -11.453125l3.953125 0q1.328125 0 2.031189 0.15625q0.984375 0.234375 1.6875 0.828125q0.90625 0.765625 1.34375 1.953125q0.453125 1.1875 0.453125 2.71875q0 1.3125 -0.3125 2.328125q-0.296875 1.0 -0.78125 1.65625q-0.46875 0.65625 -1.03125 1.046875q-0.5625 0.375 -1.375 0.578125q-0.79681396 0.1875 -1.828064 0.1875l-4.140625 0zm1.515625 -1.359375l2.453125 0q1.125 0 1.765625 -0.203125q0.65618896 -0.21875 1.031189 -0.59375q0.546875 -0.546875 0.84375 -1.453125q0.296875 -0.90625 0.296875 -2.203125q0 -1.796875 -0.59375 -2.765625q-0.578125 -0.96875 -1.421875 -1.296875q-0.60931396 -0.234375 -1.968689 -0.234375l-2.40625 0l0 8.75zm15.539001 -1.3125l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m1005.21136 425.74844l0 -11.453125l2.28125 0l2.71875 8.109375q0.375 1.125 0.546875 1.6875q0.1875 -0.625 0.609375 -1.828125l2.734375 -7.96875l2.046875 0l0 11.453125l-1.46875 0l0 -9.59375l-3.328125 9.59375l-1.359375 0l-3.3125 -9.75l0 9.75l-1.46875 0zm18.609375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.67181396 0.25 0.98431396 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21868896 -0.4375 -0.28118896 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015015 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.3359375 4.859375l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.6640625 1.625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm11.9609375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625z" fill-rule="nonzero"/><path fill="#dd7e6b" d="m604.1142 1278.9318l271.43304 0l0 101.03931l-271.43304 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m604.1142 1278.9318l271.43304 0l0 101.03931l-271.43304 0z" fill-rule="evenodd"/><path fill="#000000" d="m649.79584 1336.3715l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm15.077393 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.4417114 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm9.484375 0l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm14.7751465 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563232 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.020935 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292114 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.322083 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004211 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881714 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.8533325 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m9.328084 1118.9843l1805.9528 0l0 148.25195l-1805.9528 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m9.328084 1118.9843l1805.9528 0l0 148.25195l-1805.9528 0z" fill-rule="evenodd"/><path fill="#000000" d="m886.6997 1145.9043l0 -13.359375l1.78125 0l0 6.625l6.625 -6.625l2.390625 0l-5.59375 5.421875l5.84375 7.9375l-2.328125 0l-4.765625 -6.765625l-2.171875 2.140625l0 4.625l-1.78125 0zm18.943542 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2283325 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000671 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0z" fill-rule="nonzero"/><path fill="#f6b26b" d="m9.333333 618.1103l322.07874 0l0 295.27563l-322.07874 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m9.333333 618.1103l322.07874 0l0 295.27563l-322.07874 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m106.35317 628.42377l128.03906 0l0 27.597656l-128.03906 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m108.10317 650.1503l0 -17.1875l5.5625 0q3.171875 0 4.125 0.265625q1.484375 0.390625 2.46875 1.6875q1.0 1.28125 1.0 3.34375q0 1.578125 -0.578125 2.65625q-0.5625 1.078125 -1.453125 1.703125q-0.890625 0.609375 -1.796875 0.796875q-1.25 0.25 -3.59375 0.25l-2.265625 0l0 6.484375l-3.46875 0zm3.46875 -14.28125l0 4.875l1.890625 0q2.0625 0 2.75 -0.265625q0.6875 -0.265625 1.078125 -0.84375q0.390625 -0.578125 0.390625 -1.328125q0 -0.9375 -0.546875 -1.546875q-0.546875 -0.609375 -1.390625 -0.765625q-0.625 -0.125 -2.5 -0.125l-1.671875 0zm14.9765625 5.625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.6718674 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.0312424 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3124924 -0.4375 3.2031174 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.8906174 0 -1.3906174 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.4062424 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.3593674 0.28125 -1.7812424 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3124924 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm12.191406 -6.46875l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921875l0 4.390625l2.25 0zm13.1328125 3.6875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm5.7695312 -8.421875l0 6.328125q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm11.285156 4.734375l3.078125 0l0 1.828125q0.59375 -0.9375 1.609375 -1.515625q1.03125 -0.59375 2.265625 -0.59375q2.171875 0 3.671875 1.703125q1.515625 1.703125 1.515625 4.734375q0 3.125 -1.53125 4.859375q-1.515625 1.71875 -3.671875 1.71875q-1.03125 0 -1.875 -0.40625q-0.84375 -0.421875 -1.765625 -1.40625l0 6.265625l-3.296875 0l0 -17.1875zm3.265625 6.015625q0 2.09375 0.828125 3.109375q0.828125 1.0 2.03125 1.0q1.140625 0 1.90625 -0.921875q0.765625 -0.921875 0.765625 -3.015625q0 -1.96875 -0.796875 -2.90625q-0.78125 -0.953125 -1.9375 -0.953125q-1.203125 0 -2.0 0.9375q-0.796875 0.921875 -0.796875 2.75zm13.957031 -2.21875l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm17.800781 5.984375l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm10.550781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm5.9414062 7.296875l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m234.39223 628.42377l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m106.35317 651.7103l128.03906 0l0 2.1599731l-128.03906 0l0 -2.1599731z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/README.md&sa=D&source=editors&ust=1638577908280000&usg=AOvVaw0xtsTU7RS5l_IpLaBwIMGn" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m106.35317 627.1103l128.03906 0l0 28.799988l-128.03906 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#efefef" d="m21.837269 276.4672l225.48032 0l0 193.22833l-225.48032 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.837269 276.4672l225.48032 0l0 193.22833l-225.48032 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m100.55203 286.78064l68.05078 0l0 27.597656l-68.05078 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m117.78641 308.5072l-3.765625 0l-1.5 -3.90625l-6.875 0l-1.40625 3.90625l-3.6875 0l6.6875 -17.1875l3.671875 0l6.875 17.1875zm-6.375 -6.796875l-2.375 -6.375l-2.3125 6.375l4.6875 0zm11.347656 6.796875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm17.042969 -8.765625l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm6.2695312 6.296875l0 -4.46875l-4.5 0l0 -3.078125l4.5 0l0 -4.46875l3.0 0l0 4.46875l4.515625 0l0 3.078125l-4.515625 0l0 4.46875l-3.0 0zm14.015625 0l0 -4.46875l-4.5 0l0 -3.078125l4.5 0l0 -4.46875l3.0 0l0 4.46875l4.515625 0l0 3.078125l-4.515625 0l0 4.46875l-3.0 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m168.60281 286.78064l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m100.55203 310.0672l68.05078 0l0 2.1600037l-68.05078 0l0 -2.1600037z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/arc%2B%2B&sa=D&source=editors&ust=1638577908282000&usg=AOvVaw0QKpgc0Stl6OfekfPGHexe" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m100.55203 285.4672l68.05078 0l0 28.799988l-68.05078 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#efefef" d="m51.359577 317.66797l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m51.359577 317.66797l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m118.765755 327.9814l90.66796 0l0 27.597656l-90.66796 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m131.50012 343.39548l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5624924 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375 5.828125 -2.375q3.1562424 0 5.1249924 1.859375q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.3437424 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.3749924 0 2.3749924 -0.875q1.0 -0.890625 1.421875 -2.765625zm9.472656 6.3125l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm10.878906 2.671875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm20.222656 -8.90625l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921875l0 4.390625l2.25 0zm2.2734375 -1.6875l0 -3.046875l3.296875 0l0 3.046875l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm17.996094 0l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm3.3320312 -14.140625l0 -3.046875l3.296875 0l0 3.046875l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m209.43372 327.9814l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m118.765755 351.26797l90.66796 0l0 2.1600037l-90.66796 0l0 -2.1600037z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/crostini&sa=D&source=editors&ust=1638577908284000&usg=AOvVaw2I83KHoP3INVulvOCAyGG-" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m118.765755 326.66797l90.66796 0l0 28.800018l-90.66796 0l0 -28.800018z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m597.50134 1156.5826l309.57477 0l0 88.188965l-309.57477 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m597.50134 1156.5826l309.57477 0l0 88.188965l-309.57477 0z" fill-rule="evenodd"/><path fill="#000000" d="m706.8266 1183.5027l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm15.077454 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.4416504 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm15.59375 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266357 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323364 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.5720215 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m1024.3439 1197.4121l258.2047 0l0 54.141724l-258.2047 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1024.3439 1197.4121l258.2047 0l0 54.141724l-258.2047 0z" fill-rule="evenodd"/><path fill="#000000" d="m1084.0692 1226.7155l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.363525 1.578125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1447754 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm9.375 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm14.931519 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.56311 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm26.989746 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266357 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323975 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.12561 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.5721436 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#f6b26b" d="m71.01837 1128.9003l202.4567 0l0 54.141724l-202.4567 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m71.01837 1128.9003l202.4567 0l0 54.141724l-202.4567 0z" fill-rule="evenodd"/><path fill="#000000" d="m141.5635 1153.3911l0 -13.359375l5.921875 0q1.78125 0 2.703125 0.359375q0.9375 0.359375 1.484375 1.28125q0.5625 0.90625 0.5625 2.015625q0 1.40625 -0.921875 2.390625q-0.921875 0.96875 -2.84375 1.234375q0.703125 0.34375 1.078125 0.671875q0.765625 0.703125 1.453125 1.765625l2.328125 3.640625l-2.21875 0l-1.765625 -2.78125q-0.78125 -1.203125 -1.28125 -1.828125q-0.5 -0.640625 -0.90625 -0.890625q-0.390625 -0.265625 -0.796875 -0.359375q-0.296875 -0.078125 -0.984375 -0.078125l-2.046875 0l0 5.9375l-1.765625 0zm1.765625 -7.453125l3.796875 0q1.21875 0 1.890625 -0.25q0.6875 -0.265625 1.046875 -0.8125q0.359375 -0.546875 0.359375 -1.1875q0 -0.953125 -0.6875 -1.5625q-0.6875 -0.609375 -2.1875 -0.609375l-4.21875 0l0 4.421875zm10.863571 2.609375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625717 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.625717 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144821 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.063217 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#000000" d="m112.83266 1162.9874l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 3.1875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm10.6953125 2.84375l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm4.8984375 4.171875l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.5859375 4.21875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.9453125 2.6875l3.328125 -11.859375l1.125 0l-3.3125 11.859375l-1.140625 0zm9.953125 -0.203125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5234375 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm6.6484375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1328.8635 88.38316l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1328.8635 88.38316l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path fill="#000000" d="m1368.1232 109.055664l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm10.484375 -0.46875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm7.1796875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm15.4296875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 -1.75l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0zm8.15625 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1450.1075 98.25879l42.671875 0l0 18.398438l-42.671875 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1451.1075 115.94629l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm7.5 -5.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1492.7794 98.25879l4.4453125 0l0 18.398438l-4.4453125 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1450.1075 113.783165l42.671875 0l0 1.4400024l-42.671875 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1399.4161 117.25879l61.351562 0l0 18.398438l-61.351562 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1400.1349 128.05566l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.6875 1.015625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm7.640625 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.265625 0.375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m1460.7677 117.25879l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1399.4161 132.78316l61.351562 0l0 1.4400024l-61.351562 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/2196359393073&sa=D&source=editors&ust=1638577908298000&usg=AOvVaw1FPXhPS5m-Kwoz-RQElkN_" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1450.1075 97.38316l47.117188 0l0 19.199997l-47.117188 0l0 -19.199997z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/2196359393073&sa=D&source=editors&ust=1638577908299000&usg=AOvVaw3di9lJXxv75lDFQVgdiKED" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1399.4161 116.38316l61.351562 0l0 19.199997l-61.351562 0l0 -19.199997z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m103.63911 88.3832l202.4567 0l0 59.71653l-202.4567 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m103.63911 88.3832l202.4567 0l0 59.71653l-202.4567 0z" fill-rule="evenodd"/><path fill="#000000" d="m117.18386 112.7432l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.4062576 0l0 11.453125l-1.4062576 0zm8.992195 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m184.41043 98.25883l109.375 0l0 18.398438l-109.375 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m185.62918 112.7432l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm17.070312 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm12.6640625 0l0 -11.453125l1.515625 0l0 4.703125l5.953125 0l0 -4.703125l1.515625 0l0 11.453125l-1.515625 0l0 -5.40625l-5.953125 0l0 5.40625l-1.515625 0zm17.007812 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 3.921875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm6.6484375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m293.78543 98.25883l4.4453125 0l0 18.398438l-4.4453125 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m184.41043 113.7832l109.375 0l0 1.4400024l-109.375 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m149.72293 117.25883l110.28906 0l0 18.398445l-110.28906 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m157.3323 130.38383q-0.703125 0.78125 -1.53125 1.171875q-0.8125 0.390625 -1.765625 0.390625q-1.75 0 -2.78125 -1.203125q-0.84375 -0.96875 -0.84375 -2.15625q0 -1.0625076 0.6875 -1.9218826q0.6875 -0.859375 2.046875 -1.5q-0.78125 -0.890625 -1.046875 -1.4375q-0.25 -0.5625 -0.25 -1.078125q0 -1.03125 0.8125 -1.796875q0.8125 -0.765625 2.03125 -0.765625q1.171875 0 1.921875 0.71875q0.75 0.71875 0.75 1.734375q0 1.625 -2.171875 2.78125l2.0625 2.625q0.34375 -0.6875 0.546875 -1.59375l1.453125 0.3125q-0.375 1.5000076 -1.015625 2.4687576q0.796875 1.046875 1.796875 1.75l-0.953125 1.125q-0.84375 -0.546875 -1.75 -1.625zm-2.859375 -5.9687576q0.90625 -0.53125 1.171875 -0.9375q0.28125 -0.40625 0.28125 -0.90625q0 -0.578125 -0.375 -0.953125q-0.375 -0.375 -0.921875 -0.375q-0.578125 0 -0.953125 0.375q-0.375 0.359375 -0.375 0.890625q0 0.265625 0.125 0.5625q0.140625 0.296875 0.421875 0.625l0.625 0.71875zm1.96875 4.8593826l-2.578125 -3.1875076q-1.140625 0.671875 -1.546875 1.265625q-0.390625 0.578125 -0.390625 1.1406326q0 0.703125 0.546875 1.453125q0.5625 0.75 1.578125 0.75q0.640625 0 1.3125 -0.390625q0.671875 -0.40625 1.078125 -1.03125zm17.804688 -1.5468826l1.515625 0.37500763q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375076 -0.609375 -3.0781326q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625076q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.1718826zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.5937576 -0.484375 2.5156326q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.2343826zm1.453125 0q0 1.5937576 0.6875 2.3906326q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375076q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.1562576l0 -8.296883l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.1093826l-1.40625 0l0 -5.0468826q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.5312576l-1.40625 0zm9.2265625 0l0 -7.2031326l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.2031326l-1.40625 0zm4.1171875 -9.843758l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.9687576q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.1718826q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.9843826q0 1.6250076 0.640625 2.3750076q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.3437576q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.2968826l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.1406326l1.40625 0l0 4.5937576q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.6250076l0 -4.4375l1.40625 0l0 8.296883l-1.25 0zm3.4453125 0l0 -8.296883l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.3437576l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.5156326 0.71875 -0.8125076q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.8750076q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.1406326q-0.765625 0.3125 -2.296875 0.5312576q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.5156326zm6.6640625 2.9062576l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.7656326l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.8437576q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578133l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm3.0234375 -4.1562576q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.5937576 -0.484375 2.5156326q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.2343826zm1.453125 0q0 1.5937576 0.6875 2.3906326q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375076q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.1562576l0 -8.296883l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.1093826l-1.40625 0l0 -5.0468826q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.5312576l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m260.012 117.25883l0 0l0 18.398445l0 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m149.72293 132.7832l110.28906 0l0 1.4400024l-110.28906 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1276489334661&sa=D&source=editors&ust=1638577908304000&usg=AOvVaw3CQEuqYuDzyQl981I5Lpea" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m184.41043 97.3832l113.82031 0l0 19.199997l-113.82031 0l0 -19.199997z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1276489334661&sa=D&source=editors&ust=1638577908304000&usg=AOvVaw3CQEuqYuDzyQl981I5Lpea" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m149.72293 116.3832l110.28906 0l0 19.200005l-110.28906 0l0 -19.200005z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m577.72833 88.39895l202.45673 0l0 59.685036l-202.45673 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m577.72833 88.39895l202.45673 0l0 59.685036l-202.45673 0z" fill-rule="evenodd"/><path fill="#000000" d="m621.06213 112.75895l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m683.8434 98.274574l54.242188 0l0 18.398438l-54.242188 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m693.24963 108.743324l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.8828125 1.34375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8046875 4.953125l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m738.0856 98.274574l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m683.8434 113.79895l54.242188 0l0 1.4400024l-54.242188 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/2023123091425&sa=D&source=editors&ust=1638577908306000&usg=AOvVaw1B90wrwL6E-cNU_NeS7ZZt" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m683.8434 97.39895l54.242188 0l0 19.200005l-54.242188 0l0 -19.200005z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m814.77295 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m814.77295 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path fill="#000000" d="m867.01306 112.75772l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m934.2396 98.273346l31.984375 0l0 18.398438l-31.984375 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m937.474 112.75772l-3.03125 -11.453125l1.546875 0l1.75 7.5q0.28125 1.1875 0.484375 2.34375q0.4375 -1.828125 0.515625 -2.109375l2.171875 -7.734375l1.828125 0l1.640625 5.796875q0.625 2.15625 0.890625 4.046875q0.21875 -1.078125 0.578125 -2.484375l1.796875 -7.359375l1.515625 0l-3.140625 11.453125l-1.453125 0l-2.421875 -8.734375q-0.296875 -1.09375 -0.359375 -1.34375q-0.171875 0.796875 -0.328125 1.34375l-2.4375 8.734375l-1.546875 0zm12.9296875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.8046875 0l0 -11.453125l7.734375 0l0 1.34375l-6.21875 0l0 3.546875l5.375 0l0 1.359375l-5.375 0l0 5.203125l-1.515625 0zm9.5234375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m966.224 98.273346l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m934.2396 113.79772l31.984375 0l0 1.4400024l-31.984375 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1289555489305&sa=D&source=editors&ust=1638577908311000&usg=AOvVaw2R2RLBoNRt8I4DHkmJ1RXI" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m934.2396 97.39772l31.984375 0l0 19.199997l-31.984375 0l0 -19.199997z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m340.68372 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m340.68372 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path fill="#000000" d="m368.90036 112.75772l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m436.12692 98.273346l80.03122 0l0 18.398438l-80.03122 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m437.34567 112.75772l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm17.070312 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm8.0 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.6328125 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.9687195 0 1.4999695 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.2968445 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.4687195 0 2.4218445 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.1093445 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.9687195 0 1.6249695 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.6249695 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m516.15814 98.273346l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m436.12692 113.79772l80.03122 0l0 1.4400024l-80.03122 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1312179520755&sa=D&source=editors&ust=1638577908313000&usg=AOvVaw2XNWv69vMsQ5ecM0WJA1bT" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m436.12692 97.39772l80.03122 0l0 19.199997l-80.03122 0l0 -19.199997z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m443.3176 1015.5171l128.40945 0l0 37.57483l-128.40945 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m443.3176 1015.5171l128.40945 0l0 37.57483l-128.40945 0z" fill-rule="evenodd"/><path fill="#000000" d="m472.3561 1036.3807q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297577 8.546875l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516357 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141327 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.063202 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 3.703125l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.891357 4.78125l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0z" fill-rule="nonzero"/><path fill="#6d9eeb" d="m340.91208 728.53687l0 0c0 -4.1400146 3.3561707 -7.496155 7.496216 -7.496155l63.117798 0c1.9881287 0 3.894806 0.7897339 5.3006287 2.1955566c1.4058228 1.4058228 2.1955872 3.3125 2.1955872 5.300598l0 29.984009c0 4.1400146 -3.3561707 7.496216 -7.496216 7.496216l-63.117798 0c-4.140045 0 -7.496216 -3.3562012 -7.496216 -7.496216z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m340.91208 728.53687l0 0c0 -4.1400146 3.3561707 -7.496155 7.496216 -7.496155l63.117798 0c1.9881287 0 3.894806 0.7897339 5.3006287 2.1955566c1.4058228 1.4058228 2.1955872 3.3125 2.1955872 5.300598l0 29.984009c0 4.1400146 -3.3561707 7.496216 -7.496216 7.496216l-63.117798 0c-4.140045 0 -7.496216 -3.3562012 -7.496216 -7.496216z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m357.6342 730.1856l44.666016 0l0 13.798828l-44.666016 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m358.68106 741.0489l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0527344 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm2.6972656 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6660156 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm10.246094 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0527344 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm6.7597656 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm10.292969 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m402.3002 730.1856l0 0l0 13.798828l0 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m357.6342 741.82886l44.666016 0l0 1.0800171l-44.666016 0l0 -1.0800171z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m356.28653 744.1856l47.36133 0l0 13.798828l-47.36133 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m357.17715 755.0489l0 -8.59375l1.71875 0l2.03125 6.078125q0.28125 0.859375 0.40625 1.28125q0.140625 -0.46875 0.453125 -1.375l2.0625 -5.984375l1.53125 0l0 8.59375l-1.09375 0l0 -7.1875l-2.5 7.1875l-1.03125 0l-2.484375 -7.3125l0 7.3125l-1.09375 0zm13.964844 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.736328 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.5019531 3.640625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.251953 1.21875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m403.64786 744.1856l0 0l0 13.798828l0 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m356.28653 755.82886l47.36133 0l0 1.0800171l-47.36133 0l0 -1.0800171z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/doc/manager-api.txt?q%3Dmanager-api.txt%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908318000&usg=AOvVaw3ha3kAeFKoB6MsRUbQVgoe" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m357.6342 729.5289l44.666016 0l0 14.400024l-44.666016 0l0 -14.400024z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/doc/manager-api.txt?q%3Dmanager-api.txt%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908318000&usg=AOvVaw3ha3kAeFKoB6MsRUbQVgoe" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m356.28653 743.5289l47.36133 0l0 14.400024l-47.36133 0l0 -14.400024z" fill-rule="nonzero"/></a><path fill="#000000" fill-opacity="0.0" d="m0.0026238845 -0.0131233595l1931.8425 0l0 70.89764l-1931.8425 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m0.0026238845 -0.0131233595l1931.8425 0l0 70.89764l-1931.8425 0z" fill-rule="evenodd"/><path fill="#000000" d="m627.89264 25.714378l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5625 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375001 5.828125 -2.375001q3.15625 0 5.125 1.859376q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.34375 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.375 0 2.375 -0.875q1.0 -0.890625 1.421875 -2.765625zm9.597656 -10.875001l0 6.328126q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm14.535156 17.1875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm11.800781 -6.234375l3.03125 0l0 1.703125q1.625 -1.984375 3.875 -1.984375q1.203125 0 2.078125 0.5q0.875 0.484375 1.4375 1.484375q0.828125 -1.0 1.765625 -1.484375q0.953125 -0.5 2.03125 -0.5q1.375 0 2.3125 0.5625q0.953125 0.5625 1.421875 1.640625q0.34375 0.796875 0.34375 2.578125l0 7.953125l-3.296875 0l0 -7.109375q0 -1.859375 -0.328125 -2.390625q-0.46875 -0.703125 -1.40625 -0.703125q-0.703125 0 -1.3125 0.421875q-0.609375 0.421875 -0.875 1.234375q-0.265625 0.8125 -0.265625 2.5625l0 5.984375l-3.296875 0l0 -6.828125q0 -1.8125 -0.171875 -2.328125q-0.171875 -0.53125 -0.546875 -0.78125q-0.375 -0.265625 -1.0 -0.265625q-0.765625 0 -1.375 0.40625q-0.609375 0.40625 -0.875 1.1875q-0.265625 0.765625 -0.265625 2.5625l0 6.046875l-3.28125 0l0 -12.453125zm28.792969 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm11.9375 -1.1875q0 -2.625 0.78125 -4.40625q0.59375 -1.3125 1.59375 -2.359375q1.015625 -1.046876 2.234375 -1.546876q1.59375 -0.671875 3.703125 -0.671875q3.796875 0 6.0625 2.359376q2.28125 2.34375 2.28125 6.546875q0 4.15625 -2.265625 6.515625q-2.25 2.34375 -6.03125 2.34375q-3.84375 0 -6.109375 -2.34375q-2.25 -2.34375 -2.25 -6.4375zm3.578125 -0.125q0 2.921875 1.34375 4.4375q1.34375 1.5 3.421875 1.5q2.078125 0 3.40625 -1.484375q1.328125 -1.5 1.328125 -4.5q0 -2.953125 -1.296875 -4.40625q-1.296875 -1.453125 -3.4375 -1.453125q-2.140625 0 -3.453125 1.484375q-1.3125 1.46875 -1.3125 4.421875zm14.917969 3.015625l3.375 -0.328125q0.296875 1.703125 1.21875 2.5q0.9375 0.796875 2.53125 0.796875q1.671875 0 2.515625 -0.703125q0.859375 -0.71875 0.859375 -1.671875q0 -0.609375 -0.359375 -1.03125q-0.359375 -0.421875 -1.25 -0.75q-0.609375 -0.203125 -2.78125 -0.75q-2.78125 -0.6875 -3.90625 -1.6875q-1.59375 -1.421875 -1.59375 -3.46875q0 -1.3125 0.75 -2.453125q0.75 -1.140626 2.140625 -1.734376q1.40625 -0.59375 3.390625 -0.59375q3.234375 0 4.859375 1.421875q1.640625 1.406251 1.71875 3.781251l-3.46875 0.140625q-0.21875 -1.3125 -0.953125 -1.890625q-0.734375 -0.59375 -2.203125 -0.59375q-1.5 0 -2.359375 0.625q-0.546875 0.40625 -0.546875 1.0625q0 0.609375 0.515625 1.046875q0.65625 0.546875 3.1875 1.15625q2.53125 0.59375 3.734375 1.234375q1.21875 0.640625 1.90625 1.75q0.6875 1.09375 0.6875 2.734375q0 1.46875 -0.828125 2.765625q-0.8125 1.28125 -2.3125 1.921875q-1.5 0.625 -3.75 0.625q-3.25 0 -5.0 -1.5q-1.75 -1.515625 -2.078125 -4.40625zm34.535156 -0.71875l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5625 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375001 5.828125 -2.375001q3.15625 0 5.125 1.859376q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.34375 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.375 0 2.375 -0.875q1.0 -0.890625 1.421875 -2.765625zm5.5664062 -0.09375q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm23.363281 6.21875l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm14.660156 0l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm10.550781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm16.800781 -1.46875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm8.207031 -3.6875l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm2.2734375 -1.6875l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm10.089844 0l-5.015625 -12.453125l3.46875 0l2.34375 6.359375l0.671875 2.125q0.265625 -0.8125 0.34375 -1.078125q0.15625 -0.515625 0.34375 -1.046875l2.375 -6.359375l3.390625 0l-4.953125 12.453125l-2.96875 0zm9.925781 -14.140625l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm12.386719 -12.453125l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm0.7265625 0l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm21.6875 12.453125l0 -17.046875l3.46875 0l0 14.156251l8.625 0l0 2.890625l-12.09375 0zm17.003906 -8.65625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm4.9257812 -6.46875l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm22.113281 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm9.097656 7.296875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.0273438 -3.546875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm26.640625 8.59375l-2.265625 0q-1.796875 -2.703125 -2.734375 -5.625q-0.9375 -2.921875 -0.9375 -5.640625q0 -3.390625 1.171875 -6.421875q1.0 -2.625 2.546875 -4.828126l2.25 0q-1.609375 3.546876 -2.21875 6.046876q-0.59375 2.484375 -0.59375 5.265625q0 1.921875 0.359375 3.9375q0.359375 2.015625 0.984375 3.84375q0.40625 1.1875 1.4375 3.421875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m996.59186 10.300315l312.1054 0l0 27.597656l-312.1054 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m998.01373 32.855003l3.765625 0.453125q0.09375 0.65625 0.421875 0.90625q0.46875 0.34375 1.484375 0.34375q1.28125 0 1.9375 -0.390625q0.421875 -0.25 0.65625 -0.828125q0.140625 -0.40625 0.140625 -1.515625l0 -1.8125q-1.46875 2.015625 -3.71875 2.015625q-2.515625 0 -3.96875 -2.125q-1.15625 -1.671875 -1.15625 -4.171875q0 -3.125 1.5 -4.78125q1.515625 -1.65625 3.75 -1.65625q2.3125 0 3.8125 2.03125l0 -1.75l3.078125 0l0 11.171875q0 2.203125 -0.359375 3.296875q-0.359375 1.09375 -1.015625 1.703125q-0.65625 0.625 -1.765625 0.96875q-1.09375 0.359375 -2.765625 0.359375q-3.15625 0 -4.484375 -1.078125q-1.328125 -1.078125 -1.328125 -2.75q0 -0.15625 0.015625 -0.390625zm2.9375 -7.3125q0 1.984375 0.765625 2.90625q0.765625 0.921875 1.890625 0.921875q1.21875 0 2.046875 -0.9375q0.828125 -0.953125 0.828125 -2.8125q0 -1.921875 -0.796875 -2.859375q-0.796875 -0.9375 -2.015625 -0.9375q-1.1875 0 -1.953125 0.921875q-0.765625 0.90625 -0.765625 2.796875zm11.269531 0.078125q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.812439 1.828125 1.812439 4.625q0 2.828125 -1.828064 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm10.285095 6.515625l4.25 -17.765625l2.46875 0l-4.296875 17.765625l-2.421875 0zm19.277344 -9.0625l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm5.6445312 8.765625l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm10.878906 2.671875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm14.144531 -1.03125l0 -3.296875l6.46875 0l0 3.296875l-6.46875 0zm19.210938 -4.1875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm1.7382812 2.359375q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm23.363281 6.21875l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm14.660156 0l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm10.550781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm16.800781 -1.46875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm8.207031 -3.6875l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm2.2734375 -1.6875l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm10.089844 0l-5.015625 -12.453125l3.46875 0l2.34375 6.359375l0.671875 2.125q0.265625 -0.8125 0.34375 -1.078125q0.15625 -0.515625 0.34375 -1.046875l2.375 -6.359375l3.390625 0l-4.953125 12.453125l-2.96875 0zm9.925781 -14.140625l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm12.386719 -12.453125l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm0.7265625 0l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm14.535156 7.875l0 -3.296875l6.46875 0l0 3.296875l-6.46875 0zm8.3515625 4.578125l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm9.136719 -8.65625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm4.9257812 -6.46875l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm22.113281 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm9.097656 7.296875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.0273438 -3.546875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875z" fill-rule="nonzero"/><path fill="#000000" d="m1309.5098 37.073753q0.96875 -2.078125 1.359375 -3.203125q0.40625 -1.109375 0.75 -2.5625q0.34375 -1.453125 0.5 -2.75q0.171875 -1.3125 0.171875 -2.6875q0 -2.78125 -0.609375 -5.265625q-0.59375 -2.5 -2.203125 -6.046876l2.25 0q1.765625 2.515626 2.734375 5.343751q0.984375 2.8125 0.984375 5.71875q0 2.453125 -0.765625 5.25q-0.890625 3.15625 -2.90625 6.203125l-2.265625 0z" fill-rule="nonzero"/><path fill="#000099" d="m996.59186 33.586876l312.1054 0l0 2.1599998l-312.1054 0l0 -2.1599998z" fill-rule="nonzero"/><path fill="#000000" d="m118.89459 52.65188q0 -4.265625 2.296875 -6.6875q2.296875 -2.421875 5.9375 -2.421875q2.375 0 4.28125 1.140625q1.921875 1.125 2.921875 3.171875q1.0 2.03125 1.0 4.609375q0 2.609375 -1.0625 4.671875q-1.046875 2.0625 -2.984375 3.125q-1.9375 1.0625 -4.171875 1.0625q-2.421875 0 -4.34375 -1.171875q-1.90625 -1.171875 -2.890625 -3.203125q-0.984375 -2.03125 -0.984375 -4.296875zm2.34375 0.046875q0 3.09375 1.671875 4.890625q1.671875 1.78125 4.1875 1.78125q2.578125 0 4.234375 -1.796875q1.65625 -1.8125 1.65625 -5.125q0 -2.09375 -0.71875 -3.65625q-0.703125 -1.578125 -2.078125 -2.4375q-1.359375 -0.859375 -3.046875 -0.859375q-2.421875 0 -4.171875 1.65625q-1.734375 1.65625 -1.734375 5.546875zm24.902344 8.328125l0 -1.828125q-1.453125 2.109375 -3.9375 2.109375q-1.109375 0 -2.0625 -0.421875q-0.953125 -0.421875 -1.421875 -1.0625q-0.453125 -0.640625 -0.640625 -1.5625q-0.140625 -0.625 -0.140625 -1.96875l0 -7.71875l2.109375 0l0 6.90625q0 1.65625 0.140625 2.234375q0.1875 0.828125 0.828125 1.3125q0.65625 0.46875 1.609375 0.46875q0.9375 0 1.765625 -0.484375q0.84375 -0.5 1.1875 -1.328125q0.34375 -0.84375 0.34375 -2.4375l0 -6.671875l2.109375 0l0 12.453125l-1.890625 0zm9.800781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm2.0117188 1.890625l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm21.878906 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm17.640625 1.203125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm12.472656 6.21875l0 -10.8125l-1.875 0l0 -1.640625l1.875 0l0 -1.3125q0 -1.265625 0.21875 -1.875q0.296875 -0.8125 1.0625 -1.3125q0.78125 -0.515625 2.15625 -0.515625q0.890625 0 1.96875 0.203125l-0.3125 1.84375q-0.65625 -0.125 -1.25 -0.125q-0.953125 0 -1.359375 0.421875q-0.390625 0.40625 -0.390625 1.53125l0 1.140625l2.421875 0l0 1.640625l-2.421875 0l0 10.8125l-2.09375 0zm12.8203125 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm21.878906 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm16.363281 5.53125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm4.3554688 1.890625l-3.796875 -12.453125l2.171875 0l1.984375 7.1875l0.734375 2.671875q0.046875 -0.203125 0.640625 -2.5625l1.984375 -7.296875l2.171875 0l1.859375 7.21875l0.625 2.390625l0.71875 -2.40625l2.125 -7.203125l2.046875 0l-3.890625 12.453125l-2.1875 0l-1.984375 -7.453125l-0.46875 -2.125l-2.53125 9.578125l-2.203125 0zm14.253906 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.941406 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm8.0234375 0l0 -17.1875l2.109375 0l0 9.796875l5.0 -5.0625l2.71875 0l-4.75 4.625l5.234375 7.828125l-2.59375 0l-4.125 -6.359375l-1.484375 1.421875l0 4.9375l-2.109375 0zm12.0 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.972656 1.03125l2.046875 0.3125q0.125 0.9375 0.71875 1.375q0.78125 0.59375 2.140625 0.59375q1.46875 0 2.265625 -0.59375q0.796875 -0.578125 1.078125 -1.640625q0.15625 -0.640625 0.140625 -2.703125q-1.375 1.625 -3.4375 1.625q-2.5625 0 -3.96875 -1.84375q-1.40625 -1.859375 -1.40625 -4.453125q0 -1.78125 0.640625 -3.28125q0.640625 -1.515625 1.859375 -2.328125q1.234375 -0.828125 2.890625 -0.828125q2.203125 0 3.625 1.78125l0 -1.5l1.953125 0l0 10.765625q0 2.90625 -0.59375 4.109375q-0.59375 1.21875 -1.875 1.921875q-1.28125 0.703125 -3.15625 0.703125q-2.234375 0 -3.609375 -1.0q-1.359375 -1.0 -1.3125 -3.015625zm1.734375 -7.484375q0 2.453125 0.96875 3.578125q0.984375 1.125 2.453125 1.125q1.453125 0 2.4375 -1.109375q0.984375 -1.125 0.984375 -3.515625q0 -2.28125 -1.015625 -3.4375q-1.015625 -1.171875 -2.453125 -1.171875q-1.40625 0 -2.390625 1.140625q-0.984375 1.140625 -0.984375 3.390625zm18.609375 6.453125l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm13.503906 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3007812 11.046875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm20.625 -8.8125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm11.738281 7.421875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.1640625 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm18.730469 -2.5q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm32.546875 -6.03125l2.28125 0.578125q-0.71875 2.796875 -2.578125 4.28125q-1.859375 1.46875 -4.546875 1.46875q-2.765625 0 -4.515625 -1.125q-1.734375 -1.140625 -2.640625 -3.28125q-0.90625 -2.15625 -0.90625 -4.609375q0 -2.6875 1.015625 -4.6875q1.03125 -2.0 2.921875 -3.03125q1.890625 -1.03125 4.171875 -1.03125q2.578125 0 4.328125 1.3125q1.765625 1.3125 2.453125 3.6875l-2.234375 0.53125q-0.609375 -1.875 -1.75 -2.734375q-1.125 -0.859375 -2.84375 -0.859375q-1.984375 0 -3.3125 0.953125q-1.328125 0.953125 -1.875 2.546875q-0.53125 1.59375 -0.53125 3.296875q0 2.1875 0.625 3.828125q0.640625 1.640625 1.984375 2.453125q1.359375 0.796875 2.921875 0.796875q1.921875 0 3.234375 -1.09375q1.328125 -1.109375 1.796875 -3.28125zm4.8007812 6.03125l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm13.332031 0l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.2265625 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm28.523438 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm18.0 -0.953125q0 -4.265625 2.296875 -6.6875q2.296875 -2.421875 5.9375 -2.421875q2.375 0 4.28125 1.140625q1.921875 1.125 2.921875 3.171875q1.0 2.03125 1.0 4.609375q0 2.609375 -1.0625 4.671875q-1.046875 2.0625 -2.984375 3.125q-1.9375 1.0625 -4.171875 1.0625q-2.421875 0 -4.34375 -1.171875q-1.90625 -1.171875 -2.890625 -3.203125q-0.984375 -2.03125 -0.984375 -4.296875zm2.34375 0.046875q0 3.09375 1.671875 4.890625q1.671875 1.78125 4.1875 1.78125q2.578125 0 4.234375 -1.796875q1.65625 -1.8125 1.65625 -5.125q0 -2.09375 -0.71875 -3.65625q-0.703125 -1.578125 -2.078125 -2.4375q-1.359375 -0.859375 -3.046875 -0.859375q-2.421875 0 -4.171875 1.65625q-1.734375 1.65625 -1.734375 5.546875zm16.246094 2.8125l2.140625 -0.1875q0.15625 1.28125 0.703125 2.109375q0.5625 0.828125 1.734375 1.34375q1.171875 0.5 2.640625 0.5q1.296875 0 2.296875 -0.375q1.0 -0.390625 1.484375 -1.0625q0.484375 -0.6875 0.484375 -1.484375q0 -0.796875 -0.46875 -1.40625q-0.46875 -0.609375 -1.546875 -1.015625q-0.6875 -0.265625 -3.0625 -0.828125q-2.359375 -0.578125 -3.3125 -1.078125q-1.234375 -0.640625 -1.84375 -1.59375q-0.59375 -0.96875 -0.59375 -2.140625q0 -1.3125 0.734375 -2.4375q0.75 -1.125 2.15625 -1.703125q1.421875 -0.59375 3.15625 -0.59375q1.90625 0 3.359375 0.609375q1.46875 0.609375 2.25 1.8125q0.796875 1.1875 0.84375 2.703125l-2.171875 0.171875q-0.171875 -1.640625 -1.1875 -2.46875q-1.015625 -0.828125 -3.0 -0.828125q-2.0625 0 -3.015625 0.765625q-0.9375 0.75 -0.9375 1.8125q0 0.921875 0.671875 1.515625q0.65625 0.609375 3.421875 1.234375q2.78125 0.625 3.8125 1.09375q1.5 0.6875 2.203125 1.75q0.71875 1.0625 0.71875 2.4375q0 1.375 -0.78125 2.59375q-0.78125 1.203125 -2.25 1.890625q-1.46875 0.671875 -3.3125 0.671875q-2.328125 0 -3.90625 -0.671875q-1.578125 -0.6875 -2.484375 -2.046875q-0.890625 -1.375 -0.9375 -3.09375zm17.070312 5.515625l0 -2.40625l2.390625 0l0 2.40625q0 1.328125 -0.46875 2.140625q-0.46875 0.8125 -1.484375 1.265625l-0.578125 -0.90625q0.65625 -0.296875 0.96875 -0.875q0.328125 -0.5625 0.359375 -1.625l-1.1875 0zm20.898438 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.09375 -1.65625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.910156 6.21875l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm4.5976562 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.941406 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm22.800781 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.09375 -1.65625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm20.035156 6.21875l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm20.472656 2.203125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm19.832031 7.421875l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm20.5625 6.21875l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.332031 11.109375l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm26.886719 -6.328125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3945312 11.015625l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.425781 10.921875l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.410156 6.15625l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.2265625 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm10.550781 6.21875l4.546875 -6.46875l-4.203125 -5.984375l2.640625 0l1.90625 2.921875q0.546875 0.828125 0.875 1.390625q0.515625 -0.765625 0.9375 -1.359375l2.109375 -2.953125l2.515625 0l-4.296875 5.859375l4.625 6.59375l-2.59375 0l-2.546875 -3.875l-0.6875 -1.03125l-3.265625 4.90625l-2.5625 0zm13.421875 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm28.117188 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm10.003906 4.359375l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm23.03125 5.53125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm19.878906 5.890625q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3945312 6.25l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm26.644531 0l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.539062 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm10.910156 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.84375 8.484375l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm10.644531 -0.0625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.124939 0 2.062439 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.87493896 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.503845 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.859375 -11.03125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm7.2695312 0l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.441406 -8.4375l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.2695312 0l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm9.925781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.9648438 6.6875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm17.183594 -4.5l4.984375 -17.765625l1.6875 0l-4.96875 17.765625l-1.703125 0zm14.9140625 4.46875l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.410156 6.15625l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm8.0234375 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm28.117188 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3789062 6.25l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.9140625 4.796875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm18.761719 -0.03125l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm10.644531 -0.0625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.972656 -8.53125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm17.957031 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm7.9453125 -4.328125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm12.472656 6.21875l0 -10.8125l-1.875 0l0 -1.640625l1.875 0l0 -1.3125q0 -1.265625 0.21875 -1.875q0.296875 -0.8125 1.0625 -1.3125q0.78125 -0.515625 2.15625 -0.515625q0.890625 0 1.96875 0.203125l-0.3125 1.84375q-0.65625 -0.125 -1.25 -0.125q-0.953125 0 -1.359375 0.421875q-0.390625 0.40625 -0.390625 1.53125l0 1.140625l2.421875 0l0 1.640625l-2.421875 0l0 10.8125l-2.09375 0zm20.945312 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.09375 -1.65625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm17.957031 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.183594 0.359375q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm13.519531 1.6875l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm8.484375 2.671875l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm2.6679688 1.890625l0 -2.40625l2.390625 0l0 2.40625l-2.390625 0zm12.2265625 -5.515625l2.140625 -0.1875q0.15625 1.28125 0.703125 2.109375q0.5625 0.828125 1.734375 1.34375q1.171875 0.5 2.640625 0.5q1.296875 0 2.296875 -0.375q1.0 -0.390625 1.484375 -1.0625q0.484375 -0.6875 0.484375 -1.484375q0 -0.796875 -0.46875 -1.40625q-0.46875 -0.609375 -1.546875 -1.015625q-0.6875 -0.265625 -3.0625 -0.828125q-2.359375 -0.578125 -3.3125 -1.078125q-1.234375 -0.640625 -1.84375 -1.59375q-0.59375 -0.96875 -0.59375 -2.140625q0 -1.3125 0.734375 -2.4375q0.75 -1.125 2.15625 -1.703125q1.421875 -0.59375 3.15625 -0.59375q1.90625 0 3.359375 0.609375q1.46875 0.609375 2.25 1.8125q0.796875 1.1875 0.84375 2.703125l-2.171875 0.171875q-0.171875 -1.640625 -1.1875 -2.46875q-1.015625 -0.828125 -3.0 -0.828125q-2.0625 0 -3.015625 0.765625q-0.9375 0.75 -0.9375 1.8125q0 0.921875 0.671875 1.515625q0.65625 0.609375 3.421875 1.234375q2.78125 0.625 3.8125 1.09375q1.5 0.6875 2.203125 1.75q0.71875 1.0625 0.71875 2.4375q0 1.375 -0.78125 2.59375q-0.78125 1.203125 -2.25 1.890625q-1.46875 0.671875 -3.3125 0.671875q-2.328125 0 -3.90625 -0.671875q-1.578125 -0.6875 -2.484375 -2.046875q-0.890625 -1.375 -0.9375 -3.09375zm16.507812 10.28125l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.378906 6.15625l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm9.925781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.6796875 1.890625l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm10.644531 0.09375q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm10.550781 6.21875l4.546875 -6.46875l-4.203125 -5.984375l2.640625 0l1.90625 2.921875q0.546875 0.828125 0.875 1.390625q0.515625 -0.765625 0.9375 -1.359375l2.109375 -2.953125l2.515625 0l-4.296875 5.859375l4.625 6.59375l-2.59375 0l-2.546875 -3.875l-0.6875 -1.03125l-3.265625 4.90625l-2.5625 0zm21.9375 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm10.910156 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm19.527344 -11.03125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm21.425781 0l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm11.957031 -8.53125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm13.441406 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm12.0 3.03125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm10.003906 4.359375l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm17.578125 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.84375 3.71875l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm21.472656 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3789062 6.25l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.539062 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm19.832031 7.421875l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm18.59375 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.539062 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm10.910156 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.84375 8.484375l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm10.644531 -0.0625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.503906 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.859375 -11.03125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm7.2695312 0l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.441406 -8.4375l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.2695312 0l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm9.925781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.9648438 6.6875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm10.921875 -4.796875l0 -2.40625l2.390625 0l0 2.40625l-2.390625 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/cros-connectivity-layers&sa=D&source=editors&ust=1638577908338000&usg=AOvVaw10WcK-TOlAntBY-aoFINqD" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m996.59186 8.986878l312.1054 0l0 28.8l-312.1054 0l0 -28.8z" fill-rule="nonzero"/></a><path fill="#efefef" d="m95.30708 364.93045l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m95.30708 364.93045l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m158.67615 375.2439l98.74219 0l0 27.597656l-98.74219 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m160.42615 396.97046l0 -17.1875l5.5625 0q3.171875 0 4.125 0.265625q1.484375 0.390625 2.46875 1.6875q1.0 1.28125 1.0 3.34375q0 1.578125 -0.578125 2.65625q-0.5625 1.078125 -1.453125 1.703125q-0.890625 0.609375 -1.796875 0.796875q-1.25 0.25 -3.59375 0.25l-2.265625 0l0 6.484375l-3.46875 0zm3.46875 -14.28125l0 4.875l1.890625 0q2.0625 0 2.75 -0.265625q0.6875 -0.265625 1.078125 -0.84375q0.390625 -0.578125 0.390625 -1.328125q0 -0.9375 -0.546875 -1.546875q-0.546875 -0.609375 -1.390625 -0.765625q-0.625 -0.125 -2.5 -0.125l-1.671875 0zm14.9765625 5.625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm9.628906 5.984375l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm8.652344 -8.65625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm6.4726562 5.984375l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm6.6679688 0l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm13.886719 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm5.9414062 7.296875l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm5.5117188 -3.546875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m257.41833 375.2439l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m158.67615 398.53046l98.74219 0l0 2.1600037l-98.74219 0l0 -2.1600037z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/parallels&sa=D&source=editors&ust=1638577908342000&usg=AOvVaw148vfJn_nrvHzymr64ovGQ" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m158.67615 373.93045l98.74219 0l0 28.799988l-98.74219 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m21.83727 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m57.467297 686.9142l64.2675 0l0 21.45288l-64.2675 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m58.998547 703.8032l0 -13.359375l9.015629 0l0 1.578125l-7.250004 0l0 4.140625l6.265629 0l0 1.578125l-6.265629 0l0 6.0625l-1.765625 0zm11.09911 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.129196 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853302 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm10.922592 5.765625l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.156967 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.144821 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m121.7348 686.9142l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m57.467297 705.01654l64.2675 0l0 1.6799927l-64.2675 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/firewall.h&sa=D&source=editors&ust=1638577908344000&usg=AOvVaw2PHaKWNBVZQprhZlBvgEYV" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m57.467297 685.8832l64.2675 0l0 22.400024l-64.2675 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.40369 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.40369 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m209.85042 686.9142l74.63411 0l0 21.45288l-74.63411 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m211.2723 703.8032l0 -13.359375l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359375l-1.8125 0l-7.015625 -10.5l0 10.5l-1.6875 0zm13.488571 0l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.707321 1.578125l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.459198 7.0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.6189117 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.203857 4.84375l3.53125 -5.03125l-3.265625 -4.640625l2.046875 0l1.484375 2.265625q0.421875 0.640625 0.671875 1.078125q0.40625 -0.59375 0.734375 -1.0625l1.640625 -2.28125l1.953125 0l-3.34375 4.546875l3.59375 5.125l-2.015625 0l-1.984375 -3.0l-0.515625 -0.8125l-2.546875 3.8125l-1.984375 0zm10.34375 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m284.48453 686.9142l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m209.85042 705.01654l74.63411 0l0 1.6799927l-74.63411 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/ndproxy.h&sa=D&source=editors&ust=1638577908346000&usg=AOvVaw1UgsvT1ZsJPSAu_A6eqAH5" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m209.85042 685.8832l74.63411 0l0 22.400024l-74.63411 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m775.35956 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m775.35956 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m788.8585 795.5769l73.63208 0l0 21.45288l-73.63208 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m790.24915 812.46594l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm21.697021 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.2038574 4.859375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.688232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.8913574 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953796 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m862.4906 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m788.8585 813.67926l73.63208 0l0 1.6799927l-73.63208 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/manager.h&sa=D&source=editors&ust=1638577908348000&usg=AOvVaw2-GEVnopsJQSi2fuFmH9G1" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m788.8585 794.54596l73.63208 0l0 22.399963l-73.63208 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461344931474438 0.0 0.0 10.461344931474438 0.0 0.0)" spreadMethod="pad" x1="75.66739098562421" y1="77.00218558523139" x2="68.27017360807059" y2="69.60482708070391"><stop offset="0.0" stop-color="#dd7e6b"/><stop offset="0.5" stop-color="#dd7e6b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.6)" d="m663.8819 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m663.8819 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m695.5497 795.5769l37.29431 0l0 21.45288l-37.29431 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m699.3153 812.46594l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm15.077454 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.4416504 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m732.844 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m695.5497 813.67926l37.29431 0l0 1.6799927l-37.29431 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/wifi/wifi.h&sa=D&source=editors&ust=1638577908354000&usg=AOvVaw3A97TOcedFMCbtI2HLRy1F" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m695.5497 794.54596l37.29431 0l0 22.399963l-37.29431 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.7" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461347703443927 0.0 0.0 10.461347703443927 0.0 0.0)" spreadMethod="pad" x1="107.83553121986976" y1="77.00216518176951" x2="100.43830796199" y2="69.60480863733865"><stop offset="0.0" stop-color="#8e7cc3"/><stop offset="0.5" stop-color="#8e7cc3"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.7)" d="m1000.4042 778.47504l100.630005 0l0 54.141785l-100.630005 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1000.4042 778.47504l100.630005 0l0 54.141785l-100.630005 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1019.0955 795.5769l63.247253 0l0 21.45288l-63.247253 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1030.0643 807.77844l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515686 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484436 -0.8125 3.250061 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578186 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046936 0.625 2.265686 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.363525 1.578125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1447754 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519897 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.0007324 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.50415 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1082.3428 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1019.0955 813.67926l63.247253 0l0 1.6799927l-63.247253 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/cellular/cellular.h&sa=D&source=editors&ust=1638577908356000&usg=AOvVaw1vTwDcu1mpEOqtIHxz2r9g" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1019.0955 794.54596l63.247253 0l0 22.399963l-63.247253 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m889.57086 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m889.57086 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m904.623 795.5769l70.525696 0l0 21.45288l-70.525696 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m906.09174 812.46594l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm15.7872925 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m975.1487 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m904.623 813.67926l70.525696 0l0 1.6799927l-70.525696 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/ethernet/ethernet.h&sa=D&source=editors&ust=1638577908358000&usg=AOvVaw3biFSa9mbkEwor6Bzumzgu" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m904.623 794.54596l70.525696 0l0 22.399963l-70.525696 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461347703443927 0.0 0.0 10.461347703443927 0.0 0.0)" spreadMethod="pad" x1="54.50410098866407" y1="76.91786535838355" x2="47.10687773078431" y2="69.52050881395267"><stop offset="0.0" stop-color="#f6b26b"/><stop offset="0.5" stop-color="#f6b26b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.8)" d="m442.48557 777.5932l100.62991 0l0 54.141724l-100.62991 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m442.48557 777.5932l100.62991 0l0 54.141724l-100.62991 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m473.62048 783.695l38.360077 0l0 21.45288l-38.360077 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m478.87048 800.58405l-5.171875 -13.359375l1.921875 0l3.46875 9.703125q0.421875 1.171875 0.703125 2.1875q0.3125 -1.09375 0.71875 -2.1875l3.609375 -9.703125l1.796875 0l-5.234375 13.359375l-1.8125 0zm8.631073 0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.662323 7.0l0 -13.359375l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359375l-1.8125 0l-7.015625 -10.5l0 10.5l-1.6875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m511.98056 783.695l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m473.62048 801.79736l38.360077 0l0 1.6799927l-38.360077 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m461.69614 805.695l62.20877 0l0 21.45288l-62.20877 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m462.5399 818.2872l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459198 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.915802 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457306 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m523.9049 805.695l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m461.69614 823.79736l62.20877 0l0 1.6799927l-62.20877 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/vpn/vpn_service.h&sa=D&source=editors&ust=1638577908363000&usg=AOvVaw2zg2aHxdX1UdzAnDjKObQ7" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m473.62048 782.66406l38.360077 0l0 22.399963l-38.360077 0l0 -22.399963z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/vpn/vpn_service.h&sa=D&source=editors&ust=1638577908363000&usg=AOvVaw2zg2aHxdX1UdzAnDjKObQ7" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m461.69614 804.66406l62.20877 0l0 22.399963l-62.20877 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461347703443927 0.0 0.0 10.461347703443927 0.0 0.0)" spreadMethod="pad" x1="65.32182956639483" y1="76.91786535838355" x2="57.92460630851507" y2="69.52050881395267"><stop offset="0.0" stop-color="#f6b26b"/><stop offset="0.5" stop-color="#f6b26b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.9)" d="m555.65356 777.5932l100.62988 0l0 54.141724l-100.62988 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m555.65356 777.5932l100.62988 0l0 54.141724l-100.62988 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m570.191 794.695l71.55505 0l0 21.45288l-71.55505 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m571.92535 811.58405l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.8864136 0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm20.209167 2.3125l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.1292114 -0.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.766357 0l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.7926636 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.8323364 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m641.74603 794.695l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m570.191 812.79736l71.55505 0l0 1.6799927l-71.55505 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/ipconfig.h&sa=D&source=editors&ust=1638577908365000&usg=AOvVaw3IXATGun4oVNE2J1C9srPL" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m570.191 793.66406l71.55505 0l0 22.399963l-71.55505 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#b6d7a8" d="m85.13386 1028.1326l197.66931 0l0 79.149536l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m85.13386 1028.1326l197.66931 0l0 79.149536l-197.66931 0z" fill-rule="evenodd"/><path fill="#000000" d="m143.72734 1058.7556l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.844467 4.78125l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.9958038 1.46875l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.183304 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281967 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm23.697052 -1.578125l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm0.9851074 1.8125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m123.308365 1060.1636l121.32028 0l0 21.45288l-121.32028 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m123.745865 1074.2869l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm10.063217 -6.90625l2.71875 0l2.328125 6.859375l2.25 -6.859375l2.65625 0l-3.421875 9.3125l-0.609375 1.6875q-0.328125 0.84375 -0.640625 1.28125q-0.3125 0.453125 -0.703125 0.71875q-0.390625 0.28125 -0.96875 0.4375q-0.578125 0.15625 -1.3125 0.15625q-0.734375 0 -1.453125 -0.15625l-0.21875 -2.0q0.59375 0.125 1.078125 0.125q0.890625 0 1.3125 -0.53125q0.4375 -0.515625 0.671875 -1.328125l-3.6875 -9.703125zm10.688217 6.90625l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm15.719467 -6.90625l0 2.03125l-1.75 0l0 3.90625q0 1.1875 0.046875 1.390625q0.046875 0.1875 0.21875 0.3125q0.1875 0.125 0.4375 0.125q0.359375 0 1.03125 -0.25l0.21875 2.0q-0.890625 0.375 -2.015625 0.375q-0.703125 0 -1.265625 -0.234375q-0.546875 -0.234375 -0.8125 -0.59375q-0.25 -0.375 -0.34375 -1.0q-0.09375 -0.453125 -0.09375 -1.8125l0 -4.21875l-1.171875 0l0 -2.03125l1.171875 0l0 -1.921875l2.578125 -1.5l0 3.421875l1.75 0zm7.368927 6.59375l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm4.422592 -4.0l2.359375 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.5625 0l0 -9.671875zm16.494644 6.109375l0 -2.5625l5.03125 0l0 2.5625l-5.03125 0zm6.431427 -6.109375l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm11.395981 5.0l-2.5625 0l0 -9.671875l2.375 0l0 1.375q0.609375 -0.984375 1.09375 -1.28125q0.484375 -0.3125 1.109375 -0.3125q0.875 0 1.6875 0.484375l-0.796875 2.234375q-0.640625 -0.421875 -1.203125 -0.421875q-0.53125 0 -0.90625 0.296875q-0.375 0.296875 -0.59375 1.078125q-0.203125 0.765625 -0.203125 3.234375l0 2.984375zm4.2134094 -4.96875q0 -1.28125 0.625 -2.46875q0.625 -1.203125 1.78125 -1.828125q1.15625 -0.625 2.578125 -0.625q2.1875 0 3.59375 1.421875q1.40625 1.421875 1.40625 3.609375q0 2.1875 -1.421875 3.640625q-1.421875 1.4375 -3.5625 1.4375q-1.328125 0 -2.546875 -0.59375q-1.203125 -0.609375 -1.828125 -1.765625q-0.625 -1.171875 -0.625 -2.828125zm2.625 0.125q0 1.453125 0.671875 2.21875q0.6875 0.75 1.6875 0.75q1.0 0 1.671875 -0.75q0.6875 -0.765625 0.6875 -2.234375q0 -1.421875 -0.6875 -2.1875q-0.671875 -0.765625 -1.671875 -0.765625q-1.0 0 -1.6875 0.765625q-0.671875 0.765625 -0.671875 2.203125zm8.130341 4.84375l3.484375 -4.984375l-3.34375 -4.6875l3.125 0l1.71875 2.65625l1.796875 -2.65625l3.015625 0l-3.28125 4.578125l3.578125 5.09375l-3.140625 0l-1.96875 -3.0l-1.984375 3.0l-3.0 0zm10.391357 -9.671875l2.71875 0l2.328125 6.859375l2.25 -6.859375l2.65625 0l-3.421875 9.3125l-0.609375 1.6875q-0.328125 0.84375 -0.640625 1.28125q-0.3125 0.453125 -0.703125 0.71875q-0.390625 0.28125 -0.96875 0.4375q-0.578125 0.15625 -1.3125 0.15625q-0.734375 0 -1.453125 -0.15625l-0.21875 -2.0q0.59375 0.125 1.078125 0.125q0.890625 0 1.3125 -0.53125q0.4375 -0.515625 0.671875 -1.328125l-3.6875 -9.703125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m244.62865 1060.1636l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m123.308365 1078.2659l121.32028 0l0 1.6800537l-121.32028 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://cs/chromeos_public/src/platform2/system-proxy/&sa=D&source=editors&ust=1638577908370000&usg=AOvVaw1HYYmp8XSa68x_8Z7y_ow5" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m123.308365 1059.1326l121.32028 0l0 22.400024l-121.32028 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m395.38846 285.48294l148.85037 0l0 37.5748l-148.85037 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m395.38846 285.48294l148.85037 0l0 37.5748l-148.85037 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m411.28503 295.21735l117.05719 0l0 15.32605l-117.05719 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m416.67566 304.75168l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm11.1024475 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm5.9124756 -0.03125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.6717224 -1.015625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm6.2578125 2.21875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm9.093628 -1.015625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.9696045 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.2734375 2.6875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm4.578003 -0.15625l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m528.3422 295.21735l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m411.28503 308.1496l117.05725 0l0 1.2000122l-117.05725 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:components/arc/net/&sa=D&source=editors&ust=1638577908373000&usg=AOvVaw3lw2gV5L-Q06nkyJFODoJn" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m411.28503 294.48294l117.05725 0l0 16.0l-117.05725 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m629.29395 1198.9606l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m629.29395 1198.9606l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m645.8408 1218.192l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.40625 3.546875l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.4802246 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm11.391296 -2.21875q-1.015625 -0.375 -1.515625 -1.0625q-0.484375 -0.703125 -0.484375 -1.671875q0 -1.453125 1.046875 -2.4375q1.046875 -1.0 2.78125 -1.0q1.75 0 2.8125 1.015625q1.078125 1.015625 1.078125 2.46875q0 0.9375 -0.5 1.625q-0.484375 0.6875 -1.46875 1.0625q1.21875 0.390625 1.859375 1.28125q0.65625 0.890625 0.65625 2.140625q0 1.703125 -1.21875 2.875q-1.21875 1.171875 -3.1875 1.171875q-1.984375 0 -3.203125 -1.171875q-1.203125 -1.171875 -1.203125 -2.921875q0 -1.3125 0.65625 -2.1875q0.671875 -0.875 1.890625 -1.1875zm-0.328125 -2.78125q0 0.9375 0.609375 1.546875q0.609375 0.59375 1.59375 0.59375q0.9375 0 1.546875 -0.59375q0.609375 -0.59375 0.609375 -1.453125q0 -0.90625 -0.625 -1.515625q-0.625 -0.625 -1.5625 -0.625q-0.9375 0 -1.5625 0.609375q-0.609375 0.59375 -0.609375 1.4375zm-0.53125 6.15625q0 0.703125 0.328125 1.359375q0.34375 0.65625 1.0 1.015625q0.65625 0.359375 1.40625 0.359375q1.171875 0 1.9375 -0.75q0.765625 -0.75 0.765625 -1.921875q0 -1.1875 -0.796875 -1.953125q-0.78125 -0.78125 -1.953125 -0.78125q-1.15625 0 -1.921875 0.765625q-0.765625 0.765625 -0.765625 1.90625zm8.719482 -2.734375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm17.313232 5.015625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm7.9382324 1.578125l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625zm8.990295 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><path fill="#dd7e6b" d="m762.1312 1198.9895l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m762.1312 1198.9895l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m772.3656 1221.7678l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.853333 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.516296 1.3125l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm5.078125 -3.6875q-1.015625 -0.375 -1.515625 -1.0625q-0.484375 -0.703125 -0.484375 -1.671875q0 -1.453125 1.046875 -2.4375q1.046875 -1.0 2.78125 -1.0q1.75 0 2.8125 1.015625q1.078125 1.015625 1.078125 2.46875q0 0.9375 -0.5 1.625q-0.484375 0.6875 -1.46875 1.0625q1.21875 0.390625 1.859375 1.28125q0.65625 0.890625 0.65625 2.140625q0 1.703125 -1.21875 2.875q-1.21875 1.171875 -3.1875 1.171875q-1.984375 0 -3.203125 -1.171875q-1.203125 -1.171875 -1.203125 -2.921875q0 -1.3125 0.65625 -2.1875q0.671875 -0.875 1.890625 -1.1875zm-0.328125 -2.78125q0 0.9375 0.609375 1.546875q0.609375 0.59375 1.59375 0.59375q0.9375 0 1.546875 -0.59375q0.609375 -0.59375 0.609375 -1.453125q0 -0.90625 -0.625 -1.515625q-0.625 -0.625 -1.5625 -0.625q-0.9375 0 -1.5625 0.609375q-0.609375 0.59375 -0.609375 1.4375zm-0.53125 6.15625q0 0.703125 0.328125 1.359375q0.34375 0.65625 1.0 1.015625q0.65625 0.359375 1.40625 0.359375q1.171875 0 1.9375 -0.75q0.765625 -0.75 0.765625 -1.921875q0 -1.1875 -0.796875 -1.953125q-0.78125 -0.78125 -1.953125 -0.78125q-1.15625 0 -1.921875 0.765625q-0.765625 0.765625 -0.765625 1.90625zm8.719482 -2.734375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm17.313232 5.015625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm7.9382324 1.578125l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625zm8.990295 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m797.91864 1082.5487l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286194 -5.286255l-117.837036 0c-1.4020386 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.99139404 0.991333 -1.5482788 2.3359375 -1.5482788 3.737915l0 21.144043c0 2.9195557 2.3666992 5.286255 5.286194 5.286255l117.837036 0c2.9194946 0 5.286194 -2.3666992 5.286194 -5.286255z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m797.91864 1082.5487l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286194 -5.286255l-117.837036 0c-1.4020386 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.99139404 0.991333 -1.5482788 2.3359375 -1.5482788 3.737915l0 21.144043c0 2.9195557 2.3666992 5.286255 5.286194 5.286255l117.837036 0c2.9194946 0 5.286194 -2.3666992 5.286194 -5.286255z" fill-rule="evenodd"/><path fill="#000000" d="m681.2918 1100.0408l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.328857 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm6.2542114 -7.234375q-1.015625 -0.375 -1.515625 -1.0625q-0.484375 -0.703125 -0.484375 -1.671875q0 -1.453125 1.046875 -2.4375q1.046875 -1.0 2.78125 -1.0q1.75 0 2.8125 1.015625q1.078125 1.015625 1.078125 2.46875q0 0.9375 -0.5 1.625q-0.484375 0.6875 -1.46875 1.0625q1.21875 0.390625 1.859375 1.28125q0.65625 0.890625 0.65625 2.140625q0 1.703125 -1.21875 2.875q-1.21875 1.171875 -3.1875 1.171875q-1.984375 0 -3.203125 -1.171875q-1.203125 -1.171875 -1.203125 -2.921875q0 -1.3125 0.65625 -2.1875q0.671875 -0.875 1.890625 -1.1875zm-0.328125 -2.78125q0 0.9375 0.609375 1.546875q0.609375 0.59375 1.59375 0.59375q0.9375 0 1.546875 -0.59375q0.609375 -0.59375 0.609375 -1.453125q0 -0.90625 -0.625 -1.515625q-0.625 -0.625 -1.5625 -0.625q-0.9375 0 -1.5625 0.609375q-0.609375 0.59375 -0.609375 1.4375zm-0.53125 6.15625q0 0.703125 0.328125 1.359375q0.34375 0.65625 1.0 1.015625q0.65625 0.359375 1.40625 0.359375q1.171875 0 1.9375 -0.75q0.765625 -0.75 0.765625 -1.921875q0 -1.1875 -0.796875 -1.953125q-0.78125 -0.78125 -1.953125 -0.78125q-1.15625 0 -1.921875 0.765625q-0.765625 0.765625 -0.765625 1.90625zm8.719482 -2.734375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm17.313171 5.015625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm7.9382324 1.578125l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625zm8.990295 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><defs><linearGradient id="p.10" gradientUnits="userSpaceOnUse" gradientTransform="matrix(11.918226986797135 0.0 0.0 11.918226986797135 0.0 0.0)" spreadMethod="pad" x1="68.35226382061998" y1="72.74442591275768" x2="59.92488040065302" y2="64.31689108923511"><stop offset="0.0" stop-color="#dd7e6b"/><stop offset="0.5" stop-color="#dd7e6b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.10)" d="m632.54333 848.19684l163.30707 0l0 37.57483l-163.30707 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m632.54333 848.19684l163.30707 0l0 37.57483l-163.30707 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m654.5752 857.01526l119.24335 0l0 21.45282l-119.24335 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m656.0127 873.90424l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm9.8654175 2.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.8064575 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1569824 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.3947754 0l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm18.129211 -1.53125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230164 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453857 2.21875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m773.81854 857.01526l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m654.5752 875.11755l119.243286 0l0 1.6800537l-119.243286 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/portal_detector.h?q%3Dportal%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908382000&usg=AOvVaw3bS8kQbkxq0I9hP8Z4-PB1" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m654.5752 855.98425l119.243286 0l0 22.400024l-119.243286 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#d9d9d9" d="m470.15485 1082.6628l0 0c0 -2.9194336 2.3667297 -5.286255 5.286194 -5.286255l98.71893 0c1.4020386 0 2.746582 0.55700684 3.737915 1.5483398c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.919464 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m470.15485 1082.6628l0 0c0 -2.9194336 2.3667297 -5.286255 5.286194 -5.286255l98.71893 0c1.4020386 0 2.746582 0.55700684 3.737915 1.5483398c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.919464 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path fill="#000000" d="m499.0708 1100.1549l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.1250305 0 -3.3750305 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.2656555 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.2187805 0q0.09375 1.59375 0.90625 2.453125q0.8125305 0.84375 2.0156555 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.3906555 -2.65625l5.4062805 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.9062805 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719452 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5583496 1.46875l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1916504 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448364 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.375732 0l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0z" fill-rule="nonzero"/><path fill="#f6b26b" d="m21.83727 731.7635l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 731.7635l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m52.79868 733.28265l73.60474 0l0 21.45288l-73.60474 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m54.189304 750.1717l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.2031288 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.8750038 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm21.71268 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.000717 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm7.769821 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457321 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.328125 2.359375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.5475922 1.96875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m126.40342 733.28265l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m52.79868 751.385l73.60474 0l0 1.6799927l-73.60474 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m47.096134 755.28265l85.00983 0l0 21.45288l-85.00983 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m48.627384 772.1717l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm10.489731 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0000038 0 3.2656288 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.3281288 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.2187538 0 2.0312538 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.0312538 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281971 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.009552 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.188217 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.493927 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906967 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.4687424 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.6249924 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m132.10596 755.28265l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m47.096134 773.385l85.00983 0l0 1.6799927l-85.00983 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/multicast_forwarder.h?q%3Dmulticast%26ss%3Dpiper%252FGoogle%252Fchromeos_public:src%252Fplatform2%252Fpatchpanel%252F&sa=D&source=editors&ust=1638577908387000&usg=AOvVaw3KmT_wONhySwXI6hSr8WwW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m52.79868 732.25165l73.60474 0l0 22.400024l-73.60474 0l0 -22.400024z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/multicast_forwarder.h?q%3Dmulticast%26ss%3Dpiper%252FGoogle%252Fchromeos_public:src%252Fplatform2%252Fpatchpanel%252F&sa=D&source=editors&ust=1638577908387000&usg=AOvVaw3KmT_wONhySwXI6hSr8WwW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m47.096134 754.25165l85.00983 0l0 22.400024l-85.00983 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.40369 731.7644l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.40369 731.7644l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m204.14331 744.2836l86.04831 0l0 21.45282l-86.04831 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m204.11206 761.1726l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.052948 5.484375l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.629196 1.578125l0 -13.359375l5.015625 0q1.53125 0 2.453125 0.40625q0.921875 0.40625 1.4375 1.25q0.53125 0.84375 0.53125 1.765625q0 0.859375 -0.46875 1.625q-0.453125 0.75 -1.390625 1.203125q1.203125 0.359375 1.859375 1.21875q0.65625 0.859375 0.65625 2.015625q0 0.9375 -0.40625 1.75q-0.390625 0.796875 -0.984375 1.234375q-0.578125 0.4375 -1.453125 0.671875q-0.875 0.21875 -2.15625 0.21875l-5.09375 0zm1.78125 -7.75l2.875 0q1.1875 0 1.6875 -0.140625q0.671875 -0.203125 1.015625 -0.671875q0.34375 -0.46875 0.34375 -1.171875q0 -0.65625 -0.328125 -1.15625q-0.3125 -0.515625 -0.90625 -0.703125q-0.59375 -0.1875 -2.03125 -0.1875l-2.65625 0l0 4.03125zm0 6.171875l3.3125 0q0.859375 0 1.203125 -0.0625q0.609375 -0.109375 1.015625 -0.359375q0.421875 -0.265625 0.6875 -0.75q0.265625 -0.484375 0.265625 -1.125q0 -0.75 -0.390625 -1.296875q-0.375 -0.546875 -1.0625 -0.765625q-0.671875 -0.234375 -1.953125 -0.234375l-3.078125 0l0 4.59375zm10.740448 1.578125l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.459213 7.0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.618927 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.203827 4.84375l3.53125 -5.03125l-3.265625 -4.640625l2.046875 0l1.484375 2.265625q0.421875 0.640625 0.671875 1.078125q0.40625 -0.59375 0.734375 -1.0625l1.640625 -2.28125l1.953125 0l-3.34375 4.546875l3.59375 5.125l-2.015625 0l-1.984375 -3.0l-0.515625 -0.8125l-2.546875 3.8125l-1.984375 0zm10.34375 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m290.19162 744.2836l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m204.14331 762.3859l86.04831 0l0 1.6799927l-86.04831 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/adb_proxy.h;l%3D28&sa=D&source=editors&ust=1638577908389000&usg=AOvVaw0gVT2WOXF8koo6WRO5yC4V" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m204.14331 743.2526l86.04831 0l0 22.399963l-86.04831 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m21.83727 789.13324l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 789.13324l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m51.751087 790.65247l75.69992 0l0 21.45282l-75.69992 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m62.719837 802.85394l1.7656288 0.453125q-0.5625038 2.171875 -2.0000038 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.9062538 2.875l-1.7343788 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.1292 -0.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625717 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.047592 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953842 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230179 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.572052 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m127.45101 790.65247l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m51.751087 808.75476l75.69992 0l0 1.6799927l-75.69992 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m58.49667 812.65247l62.20876 0l0 21.45282l-62.20876 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m59.34042 825.24457l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625038 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.8281288 -0.453125 -2.5625038 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.4531288 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.6093788 0 -2.3437538 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.6562538 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125038 0 -3.0468788 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459202 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.915802 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457321 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m120.70543 812.65247l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m58.49667 830.75476l62.20876 0l0 1.6799927l-62.20876 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/counters_service.h&sa=D&source=editors&ust=1638577908391000&usg=AOvVaw0YAbPUSZ8IkHfxKvVtjF2X" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m51.751087 789.62146l75.69992 0l0 22.399963l-75.69992 0l0 -22.399963z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/counters_service.h&sa=D&source=editors&ust=1638577908391000&usg=AOvVaw0YAbPUSZ8IkHfxKvVtjF2X" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m58.49667 811.62146l62.20876 0l0 22.399963l-62.20876 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.40369 789.13513l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.40369 789.13513l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m215.0155 790.6543l64.303925 0l0 21.45288l-64.303925 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m216.48425 807.54333l0 -13.359375l5.921875 0q1.78125 0 2.703125 0.359375q0.9375 0.359375 1.484375 1.28125q0.5625 0.90625 0.5625 2.015625q0 1.40625 -0.921875 2.390625q-0.921875 0.96875 -2.84375 1.234375q0.703125 0.34375 1.078125 0.671875q0.765625 0.703125 1.453125 1.765625l2.328125 3.640625l-2.21875 0l-1.765625 -2.78125q-0.78125 -1.203125 -1.28125 -1.828125q-0.5 -0.640625 -0.90625 -0.890625q-0.390625 -0.265625 -0.796875 -0.359375q-0.296875 -0.078125 -0.984375 -0.078125l-2.046875 0l0 5.9375l-1.765625 0zm1.765625 -7.453125l3.796875 0q1.21875 0 1.890625 -0.25q0.6875 -0.265625 1.046875 -0.8125q0.359375 -0.546875 0.359375 -1.1875q0 -0.953125 -0.6875 -1.5625q-0.6875 -0.609375 -2.1875 -0.609375l-4.21875 0l0 4.421875zm10.863571 2.609375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625717 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.625717 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.063232 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m279.31943 790.6543l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m215.0155 808.75665l64.303925 0l0 1.6799927l-64.303925 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m216.0631 812.6543l62.208755 0l0 21.45288l-62.208755 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m216.90685 825.24646l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459198 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.915802 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457306 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m278.27185 812.6543l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m216.0631 830.75665l62.208755 0l0 1.6799927l-62.208755 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/routing_service.h&sa=D&source=editors&ust=1638577908396000&usg=AOvVaw3mNpdQWHUGqgQAz3RILJEc" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m215.0155 789.62335l64.303925 0l0 22.399963l-64.303925 0l0 -22.399963z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/routing_service.h&sa=D&source=editors&ust=1638577908396000&usg=AOvVaw3mNpdQWHUGqgQAz3RILJEc" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m216.0631 811.62335l62.208755 0l0 22.399963l-62.208755 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#d9d9d9" d="m346.93045 1082.6642l0 0c0 -2.9195557 2.3666992 -5.286255 5.286194 -5.286255l98.71893 0c1.402008 0 2.7465515 0.55700684 3.737915 1.5483398c0.9913635 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m346.93045 1082.6642l0 0c0 -2.9195557 2.3666992 -5.286255 5.286194 -5.286255l98.71893 0c1.402008 0 2.7465515 0.55700684 3.737915 1.5483398c0.9913635 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path fill="#000000" d="m370.13275 1100.1562l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.46875l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5582886 1.46875l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1917114 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.375732 0l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m300.44504 1148.4199l202.36221 0l0 37.57483l-202.36221 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m300.44504 1148.4199l202.36221 0l0 37.57483l-202.36221 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m335.78268 1157.2383l131.68689 0l0 21.45288l-131.68689 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m337.25143 1174.1273l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm15.787323 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm13.054108 1.46875l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266327 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323364 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.572052 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m467.46957 1157.2383l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m335.78268 1175.3407l131.68689 0l0 1.6799316l-131.68689 0l0 -1.6799316z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/cros-ethernet-status&sa=D&source=editors&ust=1638577908401000&usg=AOvVaw2fX3wgsR5SJmGKFQewWcOA" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m335.78268 1156.2074l131.68689 0l0 22.399902l-131.68689 0l0 -22.399902z" fill-rule="nonzero"/></a><path fill="#d9d9d9" d="m300.34647 1200.2257l202.36218 0l0 37.57483l-202.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m300.34647 1200.2257l202.36218 0l0 37.57483l-202.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m350.24847 1225.9331l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.677948 7.0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.677948 7.0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm21.586517 7.0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm11.828827 5.765625l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457336 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485107 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#f6b26b" d="m442.48557 929.6273l148.85037 0l0 37.574768l-148.85037 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m442.48557 929.6273l148.85037 0l0 37.574768l-148.85037 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m459.8671 938.4457l114.08731 0l0 21.45288l-114.08731 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m463.78897 955.3347l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 3.703125l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.891327 4.78125l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm8.860107 3.703125l0 -1.1875l10.859375 0l0 1.1875l-10.859375 0zm11.891327 -3.703125l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.4531555 0 2.2187805 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.42190552 -0.265625 -0.9844055 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.853302 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.2038574 4.859375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.688232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.8912964 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953857 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m573.9544 938.4457l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m459.8671 956.54803l114.08731 0l0 1.6799927l-114.08731 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/vpn-manager/&sa=D&source=editors&ust=1638577908405000&usg=AOvVaw29nBVuUvKpGgtY8klmLoQL" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m459.8671 937.4147l114.08731 0l0 22.400024l-114.08731 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m21.83727 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m31.00421 859.0225l117.19368 0l0 21.45288l-117.19368 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m30.97296 875.9115l5.124998 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.8749981 0zm3.859373 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.084198 5.484375l0 -13.359375l5.921875 0q1.78125 0 2.703125 0.359375q0.9375 0.359375 1.484375 1.28125q0.5625 0.90625 0.5625 2.015625q0 1.40625 -0.921875 2.390625q-0.921875 0.96875 -2.84375 1.234375q0.703125 0.34375 1.078125 0.671875q0.765625 0.703125 1.453125 1.765625l2.328125 3.640625l-2.21875 0l-1.765625 -2.78125q-0.78125 -1.203125 -1.28125 -1.828125q-0.5 -0.640625 -0.90625 -0.890625q-0.390625 -0.265625 -0.796875 -0.359375q-0.296875 -0.078125 -0.984375 -0.078125l-2.046875 0l0 5.9375l-1.765625 0zm1.765625 -7.453125l3.796875 0q1.21875 0 1.890625 -0.25q0.6875 -0.265625 1.046875 -0.8125q0.359375 -0.546875 0.359375 -1.1875q0 -0.953125 -0.6875 -1.5625q-0.6875 -0.609375 -2.1875 -0.609375l-4.21875 0l0 4.421875zm21.207325 2.765625l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.1562538 0 -3.5156288 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.2500038 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.5468788 0 -2.5781288 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.4843788 0 2.5156288 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm15.1875 4.6875l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.594467 3.640625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.917679 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203842 8.5625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203842 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m148.19789 859.0225l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m31.00421 877.1249l117.19368 0l0 1.6799927l-117.19368 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/arc_service.cc&sa=D&source=editors&ust=1638577908407000&usg=AOvVaw17_FBoPhwjcPMyT4rj__nw" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m31.00421 857.9915l117.19368 0l0 22.400024l-117.19368 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.4042 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.4042 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m217.11119 848.0225l60.11357 0l0 21.45288l-60.11357 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m224.65807 861.3646l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.0 3.546875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.618927 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.641342 1.953125l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm12.671875 2.890625l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m277.22476 848.0225l5.183319 0l0 21.45288l-5.183319 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m217.11119 866.1249l60.11357 0l0 1.6799927l-60.11357 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m210.85753 870.0225l72.620895 0l0 21.45288l-72.620895 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m218.35753 886.9115l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.594467 3.640625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.917679 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203842 8.5625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4374847 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53123474 1.1875 -1.5468597 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203842 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781952 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m283.47842 870.0225l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m210.85753 888.1249l72.620895 0l0 1.6799927l-72.620895 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/crostini_service.cc&sa=D&source=editors&ust=1638577908412000&usg=AOvVaw368D12PAiv9TC2m5vGYbiK" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m217.11119 846.9915l65.29689 0l0 22.400024l-65.29689 0l0 -22.400024z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/crostini_service.cc&sa=D&source=editors&ust=1638577908412000&usg=AOvVaw368D12PAiv9TC2m5vGYbiK" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m210.85753 868.9915l72.620895 0l0 22.400024l-72.620895 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m85.13386 932.13257l197.66931 0l0 79.1496l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m85.13386 932.13257l197.66931 0l0 79.1496l-197.66931 0z" fill-rule="evenodd"/><path fill="#000000" d="m143.72734 962.7557l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.844467 4.78125l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.9958038 1.46875l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.183304 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281967 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm23.697052 -1.578125l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm0.9851074 1.8125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m138.8765 964.1635l90.18404 0l0 21.45288l-90.18404 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m149.09525 981.05255l-2.390625 0l0 -1.421875q-0.59375 0.828125 -1.40625 1.234375q-0.796875 0.40625 -1.609375 0.40625q-1.671875 0 -2.859375 -1.34375q-1.1875 -1.34375 -1.1875 -3.75q0 -2.453125 1.15625 -3.734375q1.15625 -1.28125 2.921875 -1.28125q1.625 0 2.8125 1.34375l0 -4.8125l2.5625 0l0 13.359375zm-6.84375 -5.046875q0 1.546875 0.4375 2.234375q0.609375 1.015625 1.71875 1.015625q0.890625 0 1.5 -0.75q0.625 -0.765625 0.625 -2.25q0 -1.671875 -0.609375 -2.40625q-0.59375 -0.734375 -1.53125 -0.734375q-0.90625 0 -1.53125 0.734375q-0.609375 0.71875 -0.609375 2.15625zm18.161606 5.046875l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm1.6928558 -2.765625l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm10.985092 -0.796875l0 -2.5625l5.03125 0l0 2.5625l-5.03125 0zm6.431427 -6.109375l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm11.395981 5.0l-2.5625 0l0 -9.671875l2.375 0l0 1.375q0.609375 -0.984375 1.09375 -1.28125q0.484375 -0.3125 1.109375 -0.3125q0.875 0 1.6875 0.484375l-0.796875 2.234375q-0.640625 -0.421875 -1.203125 -0.421875q-0.53125 0 -0.90625 0.296875q-0.375 0.296875 -0.59375 1.078125q-0.203125 0.765625 -0.203125 3.234375l0 2.984375zm4.213394 -4.96875q0 -1.28125 0.625 -2.46875q0.625 -1.203125 1.78125 -1.828125q1.15625 -0.625 2.578125 -0.625q2.1875 0 3.59375 1.421875q1.40625 1.421875 1.40625 3.609375q0 2.1875 -1.421875 3.640625q-1.421875 1.4375 -3.5625 1.4375q-1.328125 0 -2.546875 -0.59375q-1.203125 -0.609375 -1.828125 -1.765625q-0.625 -1.171875 -0.625 -2.828125zm2.625 0.125q0 1.453125 0.671875 2.21875q0.6875 0.75 1.6875 0.75q1.0 0 1.671875 -0.75q0.6875 -0.765625 0.6875 -2.234375q0 -1.421875 -0.6875 -2.1875q-0.671875 -0.765625 -1.671875 -0.765625q-1.0 0 -1.6875 0.765625q-0.671875 0.765625 -0.671875 2.203125zm8.130356 4.84375l3.484375 -4.984375l-3.34375 -4.6875l3.125 0l1.7187653 2.65625l1.796875 -2.65625l3.015625 0l-3.28125 4.578125l3.578125 5.09375l-3.140625 0l-1.96875 -3.0l-1.9843903 3.0l-3.0 0zm10.391342 -9.671875l2.71875 0l2.328125 6.859375l2.25 -6.859375l2.65625 0l-3.421875 9.3125l-0.609375 1.6875q-0.328125 0.84375 -0.640625 1.28125q-0.3125 0.453125 -0.703125 0.71875q-0.390625 0.28125 -0.96875 0.4375q-0.578125 0.15625 -1.3125 0.15625q-0.734375 0 -1.453125 -0.15625l-0.21875 -2.0q0.59375 0.125 1.078125 0.125q0.890625 0 1.3125 -0.53125q0.4375 -0.515625 0.671875 -1.328125l-3.6875 -9.703125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m229.06053 964.1635l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m138.8765 982.26587l90.18402 0l0 1.6799927l-90.18402 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://cs/chromeos_public/src/platform2/dns-proxy/&sa=D&source=editors&ust=1638577908415000&usg=AOvVaw05VCZTJoPTgaCYwBYFBZj2" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m138.8765 963.13257l90.18402 0l0 22.399963l-90.18402 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1051.8176 88.39772l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1051.8176 88.39772l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1086.2451 112.75772l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0zm8.609375 0l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0z" fill-rule="nonzero"/><defs><linearGradient id="p.11" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.676676705825558 0.0 0.0 14.676676705825558 0.0 0.0)" spreadMethod="pad" x1="118.92581205697938" y1="33.811077392713536" x2="108.54792943839362" y2="23.433004764225224"><stop offset="0.0" stop-color="#4a4aff"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.11)" d="m1480.3806 456.65878l225.48022 0l0 79.14963l-225.48022 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1480.3806 456.65878l225.48022 0l0 79.14963l-225.48022 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1526.8021 466.3932l132.6372 0l0 15.32605l-132.6372 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1532.1615 478.4588l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm8.443726 4.125l-2.625 -6.90625l1.234375 0l1.484375 4.140625q0.234375 0.65625 0.4375 1.390625q0.15625 -0.546875 0.4375 -1.3125l1.53125 -4.21875l1.21875 0l-2.625 6.90625l-1.09375 0zm4.7578125 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.4611816 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.6468506 4.28125l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm5.656128 -0.15625l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5079346 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.7030029 -2.40625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.2093506 0q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm9.209351 2.40625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm6.5374756 0.15625l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm5.656006 -0.15625l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.9124756 4.125l0 -0.953125l4.390625 -5.046875q-0.75 0.03125 -1.3125 0.03125l-2.828125 0l0 -0.9375l5.65625 0l0 0.765625l-3.75 4.390625l-0.71875 0.796875q0.796875 -0.0625 1.484375 -0.0625l3.1875 0l0 1.015625l-6.109375 0z" fill-rule="nonzero"/><path fill="#000099" d="m1526.8021 479.32547l132.6372 0l0 1.1999817l-132.6372 0l0 -1.1999817z" fill-rule="nonzero"/><path fill="#ffffff" d="m1512.4567 497.0188l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm7.8046875 0l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm13.828125 4.703125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3671875 3.109375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm10.6953125 2.84375l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.453125 0l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.0859375 4.953125l0 -1.140625l5.28125 -6.0625q-0.890625 0.046875 -1.578125 0.046875l-3.390625 0l0 -1.140625l6.78125 0l0 0.921875l-4.484375 5.265625l-0.875 0.96875q0.953125 -0.078125 1.78125 -0.078125l3.828125 0l0 1.21875l-7.34375 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m1516.0231 516.0188l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm9.0703125 0l0 -11.453125l3.953125 0q1.328125 0 2.03125 0.15625q0.984375 0.234375 1.6875 0.828125q0.90625 0.765625 1.34375 1.953125q0.453125 1.1875 0.453125 2.71875q0 1.3125 -0.3125 2.328125q-0.296875 1.0 -0.78125 1.65625q-0.46875 0.65625 -1.03125 1.046875q-0.5625 0.375 -1.375 0.578125q-0.796875 0.1875 -1.828125 0.1875l-4.140625 0zm1.515625 -1.359375l2.453125 0q1.125 0 1.765625 -0.203125q0.65625 -0.21875 1.03125 -0.59375q0.546875 -0.546875 0.84375 -1.453125q0.296875 -0.90625 0.296875 -2.203125q0 -1.796875 -0.59375 -2.765625q-0.578125 -0.96875 -1.421875 -1.296875q-0.609375 -0.234375 -1.96875 -0.234375l-2.40625 0l0 8.75zm15.5390625 -1.3125l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.1328125 4.953125l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.265625 0.375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.9453125 4.953125l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.0859375 4.953125l0 -1.140625l5.28125 -6.0625q-0.890625 0.046875 -1.578125 0.046875l-3.390625 0l0 -1.140625l6.78125 0l0 0.921875l-4.484375 5.265625l-0.875 0.96875q0.953125 -0.078125 1.78125 -0.078125l3.828125 0l0 1.21875l-7.34375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:device/bluetooth/bluez&sa=D&source=editors&ust=1638577908425000&usg=AOvVaw1FheNV4kZMYC4PNgKTxSYP" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1526.8021 465.65878l132.6372 0l0 16.0l-132.6372 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1525.0105 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l125.64807 0c1.4019775 0 2.74646 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5482178 2.3358765 1.5482178 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286133 5.286194l-125.64807 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1525.0105 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l125.64807 0c1.4019775 0 2.74646 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5482178 2.3358765 1.5482178 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286133 5.286194l-125.64807 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path fill="#ffffff" d="m1574.6976 649.74884l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.9124756 4.125l0 -0.953125l4.390625 -5.046875q-0.75 0.03125 -1.3125 0.03125l-2.828125 0l0 -0.9375l5.65625 0l0 0.765625l-3.75 4.390625l-0.71875 0.796875q0.796875 -0.0625 1.484375 -0.0625l3.1875 0l0 1.015625l-6.109375 0zm7.6015625 0l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm2.921753 -7.796875l0.296875 -0.921875q1.03125 0.375 1.5 0.640625q-0.125 -1.1875 -0.125 -1.625l0.9375 0q-0.015625 0.640625 -0.140625 1.609375q0.65625 -0.328125 1.53125 -0.625l0.296875 0.921875q-0.828125 0.28125 -1.625 0.375q0.40625 0.34375 1.125 1.21875l-0.78125 0.5625q-0.375 -0.515625 -0.890625 -1.40625q-0.484375 0.921875 -0.84375 1.40625l-0.765625 -0.5625q0.75 -0.921875 1.078125 -1.21875q-0.84375 -0.171875 -1.59375 -0.375z" fill-rule="nonzero"/><defs><linearGradient id="p.12" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.004211477023244 0.0 0.0 14.004211477023244 0.0 0.0)" spreadMethod="pad" x1="123.80396466675418" y1="41.32674835506461" x2="113.9015840124829" y2="31.424183209047992"><stop offset="0.0" stop-color="#4a4aff"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.12)" d="m1478.9108 556.2598l232.37793 0l0 44.97638l-232.37793 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1478.9108 556.2598l232.37793 0l0 44.97638l-232.37793 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1489.8933 565.99426l129.67603 0l0 15.32605l-129.67603 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1495.2527 578.0598l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm8.443726 4.125l-2.625 -6.90625l1.234375 0l1.484375 4.140625q0.234375 0.65625 0.4375 1.390625q0.15625 -0.546875 0.4375 -1.3125l1.53125 -4.21875l1.21875 0l-2.625 6.90625l-1.09375 0zm4.7578125 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.4611816 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.6468506 4.28125l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm5.656006 -0.15625l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.7030029 -2.40625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.2093506 0q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm9.209351 2.40625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1403809 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm6.5374756 0.15625l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm9.062378 -0.15625l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm7.7093506 3.453125l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm10.865601 3.5l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" fill-rule="nonzero"/><path fill="#000000" d="m1624.3036 578.0598l0 -9.546875l3.28125 0q1.109375 0 1.703125 0.140625q0.8125 0.1875 1.390625 0.6875q0.765625 0.640625 1.140625 1.640625q0.375 0.984375 0.375 2.25q0 1.09375 -0.265625 1.9375q-0.25 0.828125 -0.65625 1.390625q-0.390625 0.546875 -0.859375 0.859375q-0.46875 0.3125 -1.140625 0.484375q-0.65625 0.15625 -1.53125 0.15625l-3.4375 0zm1.265625 -1.125l2.03125 0q0.9375 0 1.46875 -0.171875q0.546875 -0.1875 0.875 -0.5q0.4375 -0.453125 0.6875 -1.203125q0.25 -0.765625 0.25 -1.84375q0 -1.5 -0.5 -2.296875q-0.484375 -0.8125 -1.1875 -1.078125q-0.5 -0.203125 -1.625 -0.203125l-2.0 0l0 7.296875zm8.296997 1.125l0 -9.546875l3.59375 0q1.09375 0 1.75 0.296875q0.65625 0.28125 1.03125 0.890625q0.375 0.609375 0.375 1.265625q0 0.609375 -0.34375 1.15625q-0.328125 0.53125 -0.984375 0.859375q0.859375 0.25 1.328125 0.875q0.46875 0.609375 0.46875 1.4375q0 0.671875 -0.296875 1.25q-0.28125 0.578125 -0.703125 0.890625q-0.40625 0.3125 -1.03125 0.46875q-0.625 0.15625 -1.546875 0.15625l-3.640625 0zm1.265625 -5.53125l2.0625 0q0.84375 0 1.203125 -0.109375q0.484375 -0.140625 0.71875 -0.46875q0.25 -0.34375 0.25 -0.84375q0 -0.46875 -0.234375 -0.828125q-0.21875 -0.359375 -0.640625 -0.5q-0.421875 -0.140625 -1.453125 -0.140625l-1.90625 0l0 2.890625zm0 4.40625l2.375 0q0.609375 0 0.859375 -0.046875q0.4375 -0.078125 0.734375 -0.25q0.296875 -0.1875 0.484375 -0.53125q0.1875 -0.359375 0.1875 -0.8125q0 -0.53125 -0.28125 -0.921875q-0.265625 -0.40625 -0.75 -0.5625q-0.484375 -0.15625 -1.40625 -0.15625l-2.203125 0l0 3.28125zm12.0616455 1.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm17.78894 -1.28125l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.656372 3.34375l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9924316 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.6798096 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.6717529 -1.015625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" fill-rule="nonzero"/><path fill="#000099" d="m1489.8933 578.9265l129.67603 0l0 1.2000122l-129.67603 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:device/bluetooth/dbus&sa=D&source=editors&ust=1638577908431000&usg=AOvVaw34LLFqKMJX0U3fwON_IxNW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1489.8933 565.2598l129.67603 0l0 16.0l-129.67603 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1445.042 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1445.042 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m1470.2968 325.41776l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm21.03125 -11.453125l1.515625 0l0 6.609375q0 1.734375 -0.390625 2.75q-0.390625 1.015625 -1.40625 1.65625q-1.015625 0.640625 -2.671875 0.640625q-1.609375 0 -2.640625 -0.5625q-1.015625 -0.5625 -1.453125 -1.609375q-0.4375 -1.046875 -0.4375 -2.875l0 -6.609375l1.515625 0l0 6.609375q0 1.484375 0.265625 2.203125q0.28125 0.703125 0.953125 1.09375q0.6875 0.375 1.65625 0.375q1.671875 0 2.375 -0.75q0.71875 -0.765625 0.71875 -2.921875l0 -6.609375zm4.3046875 11.453125l0 -11.453125l1.515625 0l0 11.453125l-1.515625 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1600.1207 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1600.1207 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m1635.5981 325.41776l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m1636.7192 341.74588l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm6.8984375 4.953125l3.03125 -4.3125l-2.8125 -3.984375l1.765625 0l1.265625 1.9375q0.359375 0.5625 0.578125 0.9375q0.34375 -0.515625 0.640625 -0.921875l1.390625 -1.953125l1.6875 0l-2.875 3.90625l3.09375 4.390625l-1.734375 0l-1.703125 -2.578125l-0.453125 -0.703125l-2.171875 3.28125l-1.703125 0zm12.0 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 -7.359375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#b6d7a8" d="m1557.0092 88.39895l202.45667 0l0 59.685036l-202.45667 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1557.0092 88.39895l202.45667 0l0 59.685036l-202.45667 0z" fill-rule="evenodd"/><path fill="#000000" d="m1573.3743 109.07145l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm10.484375 -0.46875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm7.1796875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm15.4296875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 -1.75l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0zm16.84375 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.328125 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 -6.796875l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm15.4375 -5.015625l-7.59375 3.25l0 -1.40625l6.015625 -2.484375l-6.015625 -2.46875l0 -1.40625l7.59375 3.203125l0 1.3125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1597.3196 117.274574l121.83594 0l0 18.398445l-121.83594 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m1606.7258 127.743324l1.515625 0.37500763q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375076 -0.609375 -3.0781326q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625076q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.1718826zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.5937576 -0.484375 2.5156326q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.2343826zm1.453125 0q0 1.5937576 0.6875 2.3906326q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375076q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.1562576l0 -8.296883l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.3437576l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.1406326q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.3750076 0.765625 2.1093826q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.2812576l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm20.625 0.9375l1.515625 0.37500763q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375076 -0.609375 -3.0781326q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625076q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.1718826zm8.6171875 2.9843826q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.5156326 0.71875 -0.8125076q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.8750076q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.1406326q-0.765625 0.3125 -2.296875 0.5312576q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.5156326zm3.6015625 7.3593826l0 -11.484383l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.2812576 -0.46875 2.2968826q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.2968826q0 1.6093826 0.640625 2.3750076q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.4531326q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm13.0390625 3.0781326q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.5156326 0.71875 -0.8125076q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.8750076q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.1406326q-0.765625 0.3125 -2.296875 0.5312576q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.5156326zm4.8984375 4.1718826l-1.3125 0l0 -11.453133l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.1406326 -1.0625 3.3125076q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.2187576q0 1.5000076 0.40625 2.1562576q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.3906326q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.6171875 -5.625l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm3.5234375 0l0 -11.453133l1.40625 0l0 11.453133l-1.40625 0zm3.5859375 -9.843758l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.7656326l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.8437576q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578133l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm9.2265625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.1406326q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.3750076 0.765625 2.1093826q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.2812576l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.4687576l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.39063263 -2.15625 -0.6718826q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.7343826q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m1719.1555 117.274574l0 0l0 18.398445l0 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m1597.3196 132.79895l121.83594 0l0 1.4400024l-121.83594 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1412950271243&sa=D&source=editors&ust=1638577908440000&usg=AOvVaw02UIGcrLQ6SEg9u4plFokz" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1597.3196 116.39895l121.83594 0l0 19.200005l-121.83594 0l0 -19.200005z" fill-rule="nonzero"/></a><path fill="#b6d7a8" d="m405.87665 349.05774l163.30707 0l0 131.18109l-163.30707 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m405.87665 349.05774l163.30707 0l0 131.18109l-163.30707 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m421.74112 358.93338l35.554688 0l0 18.398438l-35.554688 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m422.44424 367.7615q0 -1.75 0.515625 -2.9375q0.390625 -0.875 1.0625 -1.5625q0.6875 -0.703125 1.484375 -1.046875q1.078125 -0.453125 2.46875 -0.453125q2.53125 0 4.046875 1.578125q1.53125 1.5625 1.53125 4.359375q0 2.78125 -1.515625 4.359375q-1.5 1.5625 -4.03125 1.5625q-2.546875 0 -4.0625 -1.5625q-1.5 -1.5625 -1.5 -4.296875zm2.375 -0.078125q0 1.9375 0.890625 2.953125q0.90625 1.0 2.296875 1.0q1.375 0 2.265625 -1.0q0.890625 -1.0 0.890625 -2.984375q0 -1.96875 -0.875 -2.9375q-0.859375 -0.96875 -2.28125 -0.96875q-1.4375 0 -2.3125 0.984375q-0.875 0.96875 -0.875 2.953125zm10.5546875 5.734375l0 -11.453125l2.25 0l4.6875 7.640625l0 -7.640625l2.15625 0l0 11.453125l-2.328125 0l-4.609375 -7.46875l0 7.46875l-2.15625 0zm18.867188 -4.21875l2.234375 0.71875q-0.515625 1.875 -1.71875 2.796875q-1.1875 0.90625 -3.03125 0.90625q-2.28125 0 -3.75 -1.5625q-1.46875 -1.5625 -1.46875 -4.265625q0 -2.859375 1.46875 -4.4375q1.484375 -1.59375 3.890625 -1.59375q2.09375 0 3.40625 1.25q0.78125 0.734375 1.171875 2.109375l-2.28125 0.546875q-0.203125 -0.890625 -0.859375 -1.40625q-0.640625 -0.515625 -1.5625 -0.515625q-1.265625 0 -2.0625 0.921875q-0.796875 0.90625 -0.796875 2.953125q0 2.171875 0.78125 3.09375q0.78125 0.921875 2.03125 0.921875q0.921875 0 1.578125 -0.578125q0.671875 -0.59375 0.96875 -1.859375z" fill-rule="nonzero"/><path fill="#000000" d="m462.913 373.41776l0 -11.453125l3.703125 0q2.109375 0 2.75 0.171875q0.984375 0.25 1.640625 1.125q0.671875 0.859375 0.671875 2.21875q0 1.0625 -0.390625 1.78125q-0.375 0.71875 -0.96875 1.125q-0.578125 0.40625 -1.1875 0.546875q-0.828125 0.15625 -2.40625 0.15625l-1.5 0l0 4.328125l-2.3125 0zm2.3125 -9.515625l0 3.25l1.265625 0q1.359375 0 1.8125 -0.171875q0.46875 -0.1875 0.734375 -0.5625q0.265625 -0.390625 0.265625 -0.90625q0 -0.625 -0.375 -1.03125q-0.359375 -0.40625 -0.921875 -0.5q-0.421875 -0.078125 -1.671875 -0.078125l-1.109375 0zm7.828125 5.25q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.53125 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203125 1.21875 1.203125 3.09375q0 1.875 -1.21875 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.03125 -0.515625 -1.578125 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.25 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm8.0390625 4.15625l0 -11.453125l2.1875 0l0 11.453125l-2.1875 0zm4.4453125 -9.421875l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm11.6796875 -5.84375l-2.171875 0.390625q-0.109375 -0.65625 -0.5 -0.984375q-0.375 -0.328125 -1.0 -0.328125q-0.8125 0 -1.3125 0.578125q-0.484375 0.5625 -0.484375 1.890625q0 1.46875 0.5 2.078125q0.5 0.609375 1.328125 0.609375q0.625 0 1.015625 -0.34375q0.40625 -0.359375 0.578125 -1.234375l2.15625 0.375q-0.34375 1.484375 -1.296875 2.25q-0.953125 0.75 -2.546875 0.75q-1.828125 0 -2.90625 -1.140625q-1.078125 -1.15625 -1.078125 -3.1875q0 -2.0625 1.078125 -3.203125q1.09375 -1.140625 2.9375 -1.140625q1.515625 0 2.40625 0.65625q0.90625 0.640625 1.296875 1.984375zm0.6171875 -2.453125l2.34375 0l1.984375 5.890625l1.9375 -5.890625l2.265625 0l-2.921875 7.984375l-0.53125 1.453125q-0.28125 0.71875 -0.546875 1.09375q-0.265625 0.390625 -0.609375 0.625q-0.328125 0.25 -0.828125 0.375q-0.5 0.140625 -1.125 0.140625q-0.625 0 -1.234375 -0.140625l-0.203125 -1.71875q0.515625 0.109375 0.9375 0.109375q0.765625 0 1.125 -0.453125q0.375 -0.453125 0.5625 -1.140625l-3.15625 -8.328125zm21.734406 4.078125l2.234375 0.71875q-0.515625 1.875 -1.71875 2.796875q-1.1875 0.90625 -3.03125 0.90625q-2.28125 0 -3.75 -1.5625q-1.46875 -1.5625 -1.46875 -4.265625q0 -2.859375 1.46875 -4.4375q1.484375 -1.59375 3.890625 -1.59375q2.09375 0 3.40625 1.25q0.78125 0.734375 1.171875 2.109375l-2.28125 0.546875q-0.203125 -0.890625 -0.859375 -1.40625q-0.640625 -0.515625 -1.5625 -0.515625q-1.265625 0 -2.0625 0.921875q-0.796875 0.90625 -0.796875 2.953125q0 2.171875 0.78125 3.09375q0.78125 0.921875 2.03125 0.921875q0.921875 0 1.578125 -0.578125q0.671875 -0.59375 0.96875 -1.859375zm3.6953125 -0.046875q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.53125 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203064 1.21875 1.203064 3.09375q0 1.875 -1.218689 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.03125 -0.515625 -1.578125 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.25 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm15.648376 4.15625l-2.046875 0l0 -1.21875q-0.5 0.703125 -1.203125 1.0625q-0.6875 0.34375 -1.390625 0.34375q-1.421875 0 -2.453125 -1.15625q-1.015625 -1.15625 -1.015625 -3.21875q0 -2.109375 0.984375 -3.203125q1.0 -1.09375 2.515625 -1.09375q1.390625 0 2.40625 1.15625l0 -4.125l2.203125 0l0 11.453125zm-5.859375 -4.328125q0 1.328125 0.359375 1.921875q0.53125 0.859375 1.484375 0.859375q0.765625 0 1.296875 -0.640625q0.53125 -0.65625 0.53125 -1.9375q0 -1.421875 -0.515625 -2.046875q-0.515625 -0.640625 -1.328125 -0.640625q-0.78125 0 -1.3125 0.625q-0.515625 0.625 -0.515625 1.859375zm12.8203125 1.6875l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0z" fill-rule="nonzero"/><path fill="#000099" d="m421.74112 374.45773l35.554688 0l0 1.4400024l-35.554688 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#000000" d="m430.95206 411.41776l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.453125 1.859375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9453125 4.15625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 -6.796875l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm9.2265625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm18.414062 1.453125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6328125 7.296875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625305 0 1.8750305 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.8281555 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375305 0 1.6094055 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625305 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.601593 4.109375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm9.2265625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.210876 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.82806396 -0.546875 -1.296814 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.249939 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm8.3203125 4.140625l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0z" fill-rule="nonzero"/><path fill="#000000" d="m441.07315 430.41776l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.109375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9296875 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3671875 3.109375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm8.3203125 4.140625l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm13.9375305 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.1094055 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.7187805 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.3750305 -0.1875q0.1875 -0.875 0.6094055 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.273376 0l0 -1.046875q-0.78125 1.234375 -2.312439 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59368896 0.3125 0.95306396 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.437439 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.562439 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65618896 -0.796875 -1.624939 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875z" fill-rule="nonzero"/><path fill="#000000" d="m453.90128 452.60526l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm13.0390625 3.078125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.0390625 1.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.0 0l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm14.234375 -0.1875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm15.4687805 2.875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.7656555 0 -1.1875305 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.4062805 0l0 1.09375l-1.4062805 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.17190552 0.09375 0.48440552 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375z" fill-rule="nonzero"/><path fill="#000000" d="m429.6122 468.41776l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm17.070312 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm8.21875 0l0 -11.453125l1.515625 0l0 4.703125l5.953125 0l0 -4.703125l1.515625 0l0 11.453125l-1.515625 0l0 -5.40625l-5.953125 0l0 5.40625l-1.515625 0zm16.742188 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.6406555 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.9062805 0 -1.5625305 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.273468 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9296875 4.140625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.257751 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359314 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.656189 0 2.703064 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.187439 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78118896 0 1.328064 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609314 -2.28125l4.624939 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734314 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8202515 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8515625 0l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:components/onc/docs/onc_spec.md?q%3Donc_spec.md%26ss%3Dchromium&sa=D&source=editors&ust=1638577908448000&usg=AOvVaw2gP4DCQLjPpnEUVaYfcomF" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m421.74112 358.05774l35.554688 0l0 19.200012l-35.554688 0l0 -19.200012z" fill-rule="nonzero"/></a><path fill="#b6d7a8" d="m404.81628 492.5643l163.30707 0l0 54.141754l-163.30707 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m404.81628 492.5643l163.30707 0l0 54.141754l-163.30707 0z" fill-rule="evenodd"/><path fill="#000000" d="m423.3878 512.70557l2.234375 0.71875q-0.515625 1.875 -1.71875 2.796875q-1.1875 0.90625 -3.03125 0.90625q-2.28125 0 -3.75 -1.5625q-1.46875 -1.5625 -1.46875 -4.265625q0 -2.859375 1.46875 -4.4375q1.484375 -1.59375 3.890625 -1.59375q2.09375 0 3.40625 1.25q0.78125 0.734375 1.171875 2.109375l-2.28125 0.546875q-0.203125 -0.890625 -0.859375 -1.40625q-0.640625 -0.515625 -1.5625 -0.515625q-1.265625 0 -2.0625 0.921875q-0.796875 0.90625 -0.796875 2.953125q0 2.171875 0.78125 3.09375q0.78125 0.921875 2.03125 0.921875q0.921875 0 1.578125 -0.578125q0.671875 -0.59375 0.96875 -1.859375zm9.0078125 1.578125l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm6.0703125 4.859375l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625zm7.9296875 -8.296875l0 1.75l-1.5 0l0 3.34375q0 1.015625 0.046875 1.1875q0.046875 0.15625 0.1875 0.265625q0.15625 0.109375 0.375 0.109375q0.3125 0 0.890625 -0.203125l0.1875 1.703125q-0.765625 0.328125 -1.734375 0.328125q-0.59375 0 -1.078125 -0.203125q-0.46875 -0.203125 -0.703125 -0.515625q-0.21875 -0.3125 -0.296875 -0.859375q-0.078125 -0.375 -0.078125 -1.546875l0 -3.609375l-1.0 0l0 -1.75l1.0 0l0 -1.65625l2.203125 -1.28125l0 2.9375l1.5 0zm1.53125 -1.125l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm3.4765625 -8.296875l1.21875 0l0 -0.625q0 -1.046875 0.21875 -1.5625q0.234375 -0.515625 0.828125 -0.84375q0.59375 -0.328125 1.515625 -0.328125q0.9375 0 1.828125 0.28125l-0.296875 1.53125q-0.515625 -0.125 -1.0 -0.125q-0.484375 0 -0.6875 0.234375q-0.203125 0.21875 -0.203125 0.84375l0 0.59375l1.640625 0l0 1.71875l-1.640625 0l0 6.578125l-2.203125 0l0 -6.578125l-1.21875 0l0 -1.71875zm6.296875 -1.125l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm11.6796875 -5.84375l-2.171875 0.390625q-0.109375 -0.65625 -0.5 -0.984375q-0.375 -0.328125 -1.0 -0.328125q-0.8125 0 -1.3125 0.578125q-0.484375 0.5625 -0.484375 1.890625q0 1.46875 0.5 2.078125q0.5 0.609375 1.328125 0.609375q0.625 0 1.015625 -0.34375q0.40625 -0.359375 0.578125 -1.234375l2.15625 0.375q-0.34375 1.484375 -1.296875 2.25q-0.953125 0.75 -2.546875 0.75q-1.828125 0 -2.90625 -1.140625q-1.078125 -1.15625 -1.078125 -3.1875q0 -2.0625 1.078125 -3.203125q1.09375 -1.140625 2.9375 -1.140625q1.515625 0 2.40625 0.65625q0.90625 0.640625 1.296875 1.984375zm3.3046875 0.078125l-2.0 -0.359375q0.34375 -1.203125 1.15625 -1.78125q0.828125 -0.578125 2.4375 -0.578125q1.46875 0 2.1875 0.34375q0.71875 0.34375 1.015625 0.890625q0.296875 0.53125 0.296875 1.953125l-0.03125 2.5625q0 1.09375 0.109375 1.625q0.109375 0.515625 0.390625 1.109375l-2.171875 0q-0.078125 -0.21875 -0.203125 -0.65625q-0.0625 -0.1875 -0.078125 -0.25q-0.5625 0.546875 -1.203125 0.828125q-0.640625 0.265625 -1.375 0.265625q-1.28125 0 -2.015625 -0.6875q-0.734375 -0.703125 -0.734375 -1.765625q0 -0.703125 0.328125 -1.25q0.34375 -0.5625 0.9375 -0.84375q0.609375 -0.296875 1.75 -0.515625q1.546875 -0.296875 2.140625 -0.546875l0 -0.21875q0 -0.625 -0.3125 -0.890625q-0.3125 -0.28125 -1.1875 -0.28125q-0.578125 0 -0.90625 0.234375q-0.328125 0.234375 -0.53125 0.8125zm2.9375 1.78125q-0.421875 0.140625 -1.34375 0.34375q-0.90625 0.1875 -1.1875 0.375q-0.4375 0.296875 -0.4375 0.765625q0 0.46875 0.34375 0.8125q0.34375 0.328125 0.875 0.328125q0.59375 0 1.140625 -0.390625q0.390625 -0.296875 0.515625 -0.734375q0.09375 -0.28125 0.09375 -1.0625l0 -0.4375zm8.1171875 -4.3125l0 1.75l-1.5 0l0 3.34375q0 1.015625 0.046875 1.1875q0.046875 0.15625 0.1875 0.265625q0.15625 0.109375 0.375 0.109375q0.3125 0 0.890625 -0.203125l0.1875 1.703125q-0.765625 0.328125 -1.734375 0.328125q-0.59375 0 -1.078125 -0.203125q-0.46875 -0.203125 -0.703125 -0.515625q-0.21875 -0.3125 -0.296875 -0.859375q-0.078125 -0.375 -0.078125 -1.546875l0 -3.609375l-1.0 0l0 -1.75l1.0 0l0 -1.65625l2.203125 -1.28125l0 2.9375l1.5 0zm6.328125 5.65625l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm3.9921875 4.859375l0 -11.453125l3.703125 0q2.109375 0 2.75 0.171875q0.984375 0.25 1.640625 1.125q0.671875 0.859375 0.671875 2.21875q0 1.0625 -0.390625 1.78125q-0.375 0.71875 -0.96875 1.125q-0.578125 0.40625 -1.1875 0.546875q-0.828125 0.15625 -2.40625 0.15625l-1.5 0l0 4.328125l-2.3125 0zm2.3125 -9.515625l0 3.25l1.265625 0q1.359375 0 1.8125 -0.171875q0.46875 -0.1875 0.734375 -0.5625q0.265625 -0.390625 0.265625 -0.90625q0 -0.625 -0.375 -1.03125q-0.359375 -0.40625 -0.921875 -0.5q-0.421875 -0.078125 -1.671875 -0.078125l-1.109375 0zm10.4375 9.515625l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625zm3.6171875 -4.265625q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.5312195 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203125 1.21875 1.203125 3.09375q0 1.875 -1.21875 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.0312195 -0.515625 -1.5780945 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.2499695 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm10.3203125 4.15625l-3.34375 -8.296875l2.296875 0l1.5625 4.234375l0.453125 1.40625q0.1875 -0.53125 0.234375 -0.703125q0.109375 -0.359375 0.234375 -0.703125l1.578125 -4.234375l2.25 0l-3.296875 8.296875l-1.96875 0zm6.6171875 -9.421875l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm12.0546875 0l-2.046875 0l0 -1.21875q-0.5 0.703125 -1.203125 1.0625q-0.6875 0.34375 -1.390625 0.34375q-1.421875 0 -2.453125 -1.15625q-1.015625 -1.15625 -1.015625 -3.21875q0 -2.109375 0.984375 -3.203125q1.0 -1.09375 2.515625 -1.09375q1.390625 0 2.40625 1.15625l0 -4.125l2.203125 0l0 11.453125zm-5.859375 -4.328125q0 1.328125 0.359375 1.921875q0.53125 0.859375 1.484375 0.859375q0.765625 0 1.296875 -0.640625q0.53125 -0.65625 0.53125 -1.9375q0 -1.421875 -0.515625 -2.046875q-0.515625 -0.640625 -1.328125 -0.640625q-0.78125 0 -1.3125 0.625q-0.515625 0.625 -0.515625 1.859375zm12.8203125 1.6875l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm6.0703125 4.859375l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1472.627 404.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1472.627 404.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1486.9481 410.15396l203.73572 0l0 15.32605l-203.73572 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1492.3387 419.6883l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0164795 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm4.453003 0l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.70288086 -2.40625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.2093506 0q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm9.209351 2.40625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm6.3343506 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm13.006226 -5.1875l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm7.6937256 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.437378 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.7266846 0.578125l1.140625 0.15625q0.078125 0.53125 0.40625 0.78125q0.4375 0.3125 1.1875 0.3125q0.8125 0 1.25 -0.328125q0.453125 -0.3125 0.609375 -0.90625q0.09375 -0.359375 0.078125 -1.5q-0.765625 0.90625 -1.90625 0.90625q-1.4375 0 -2.21875 -1.03125q-0.78125 -1.03125 -0.78125 -2.46875q0 -0.984375 0.359375 -1.8125q0.359375 -0.84375 1.03125 -1.296875q0.6875 -0.453125 1.609375 -0.453125q1.21875 0 2.015625 0.984375l0 -0.828125l1.078125 0l0 5.96875q0 1.609375 -0.328125 2.28125q-0.328125 0.6875 -1.046875 1.078125q-0.703125 0.390625 -1.75 0.390625q-1.234375 0 -2.0 -0.5625q-0.75 -0.5625 -0.734375 -1.671875zm0.984375 -4.15625q0 1.359375 0.53125 1.984375q0.546875 0.625 1.359375 0.625q0.796875 0 1.34375 -0.625q0.546875 -0.625 0.546875 -1.953125q0 -1.265625 -0.5625 -1.90625q-0.5625 -0.640625 -1.359375 -0.640625q-0.765625 0 -1.3125 0.640625q-0.546875 0.625 -0.546875 1.875zm6.9749756 3.578125l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0080566 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1690.6838 410.15396l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1486.9481 423.0862l203.73572 0l0 1.2000122l-203.73572 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/main:chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom;drc%3Df9be5b6a5e75d03f58a9c62fd3649fc7801b2a2e&sa=D&source=editors&ust=1638577908456000&usg=AOvVaw3uOJWnLrnW4k6VWbEkyM_B" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1486.9481 409.41956l203.73572 0l0 16.0l-203.73572 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1456.1392 674.9134l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1456.1392 674.9134l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1585.1746 685.2268l64.00781 0l0 27.597656l-64.00781 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#ffffff" d="m1586.9402 689.76587l6.859375 0q2.046875 0 3.046875 0.171875q1.0 0.171875 1.78125 0.71875q0.796875 0.53125 1.328125 1.4375q0.53125 0.890625 0.53125 2.0q0 1.203125 -0.65625 2.21875q-0.65625 1.0 -1.765625 1.515625q1.578125 0.453125 2.421875 1.5625q0.84375 1.09375 0.84375 2.578125q0 1.171875 -0.546875 2.28125q-0.546875 1.109375 -1.5 1.78125q-0.9375 0.65625 -2.3125 0.796875q-0.875 0.09375 -4.1875 0.125l-5.84375 0l0 -17.1875zm3.46875 2.859375l0 3.984375l2.265625 0q2.03125 0 2.515625 -0.0625q0.890625 -0.109375 1.40625 -0.609375q0.515625 -0.515625 0.515625 -1.34375q0 -0.796875 -0.453125 -1.296875q-0.4375 -0.5 -1.296875 -0.609375q-0.515625 -0.0625 -2.96875 -0.0625l-1.984375 0zm0 6.84375l0 4.59375l3.203125 0q1.875 0 2.375 -0.109375q0.78125 -0.140625 1.265625 -0.6875q0.484375 -0.546875 0.484375 -1.453125q0 -0.78125 -0.375 -1.3125q-0.375 -0.546875 -1.09375 -0.78125q-0.703125 -0.25 -3.0625 -0.25l-2.796875 0zm13.816406 7.484375l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm14.871094 0l0 -1.859375q-0.6875 0.984375 -1.796875 1.5625q-1.109375 0.578125 -2.328125 0.578125q-1.265625 0 -2.265625 -0.546875q-0.984375 -0.5625 -1.4375 -1.546875q-0.4375 -1.0 -0.4375 -2.765625l0 -7.875l3.296875 0l0 5.71875q0 2.625 0.171875 3.21875q0.1875 0.59375 0.65625 0.9375q0.484375 0.34375 1.234375 0.34375q0.84375 0 1.5 -0.453125q0.671875 -0.46875 0.921875 -1.15625q0.25 -0.6875 0.25 -3.359375l0 -5.25l3.28125 0l0 12.453125l-3.046875 0zm13.675781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm4.6289062 7.296875l0 -2.5625l4.65625 -5.359375q1.15625 -1.3125 1.703125 -1.859375q-0.578125 0.03125 -1.515625 0.046875l-4.390625 0.015625l0 -2.734375l10.28125 0l0 2.34375l-4.75 5.484375l-1.671875 1.8125q1.359375 -0.078125 1.6875 -0.078125l5.109375 0l0 2.890625l-11.109375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1649.1824 685.2268l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#ffffff" d="m1585.1746 708.51337l64.00781 0l0 2.1600342l-64.00781 0l0 -2.1600342z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/third_party/bluez/&sa=D&source=editors&ust=1638577908458000&usg=AOvVaw2XcANOYvAC_PQRsMRV31ge" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1585.1746 683.9134l64.00781 0l0 28.799988l-64.00781 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1533.8398 1140.8188l197.66931 0l0 54.141724l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1533.8398 1140.8188l197.66931 0l0 54.141724l-197.66931 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1579.967 1167.7389l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.37072754 1.703125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0zm7.9177246 -0.234375l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.844482 4.90625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519775 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm10.672607 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9958496 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.68811 0q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm12.875732 3.375l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6052246 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#4a4aff" d="m1493.042 1291.8818l295.11816 0l0 79.14966l-295.11816 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1493.042 1291.8818l295.11816 0l0 79.14966l-295.11816 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1630.0406 1318.8019l0 -13.359375l5.015625 0q1.53125 0 2.453125 0.40625q0.921875 0.40625 1.4375 1.25q0.53125 0.84375 0.53125 1.765625q0 0.859375 -0.46875 1.625q-0.453125 0.75 -1.390625 1.203125q1.203125 0.359375 1.859375 1.21875q0.65625 0.859375 0.65625 2.015625q0 0.9375 -0.40625 1.75q-0.390625 0.796875 -0.984375 1.234375q-0.578125 0.4375 -1.453125 0.671875q-0.875 0.21875 -2.15625 0.21875l-5.09375 0zm1.78125 -7.75l2.875 0q1.1875 0 1.6875 -0.140625q0.671875 -0.203125 1.015625 -0.671875q0.34375 -0.46875 0.34375 -1.171875q0 -0.65625 -0.328125 -1.15625q-0.3125 -0.515625 -0.90625 -0.703125q-0.59375 -0.1875 -2.03125 -0.1875l-2.65625 0l0 4.03125zm0 6.171875l3.3125 0q0.859375 0 1.203125 -0.0625q0.609375 -0.109375 1.015625 -0.359375q0.421875 -0.265625 0.6875 -0.75q0.265625 -0.484375 0.265625 -1.125q0 -0.75 -0.390625 -1.296875q-0.375 -0.546875 -1.0625 -0.765625q-0.671875 -0.234375 -1.953125 -0.234375l-3.078125 0l0 4.59375zm14.1467285 1.578125l0 -11.78125l-4.40625 0l0 -1.578125l10.578125 0l0 1.578125l-4.40625 0l0 11.78125l-1.765625 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m1556.8534 1344.7238q-1.359375 -1.703125 -2.296875 -4.0q-0.9375 -2.296875 -0.9375 -4.765625q0 -2.15625 0.703125 -4.140625q0.828125 -2.3125 2.53125 -4.59375l1.171875 0q-1.09375 1.890625 -1.453125 2.703125q-0.546875 1.25 -0.875 2.625q-0.390625 1.703125 -0.390625 3.421875q0 4.375 2.71875 8.75l-1.171875 0zm12.8220215 -8.609375l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.1291504 -0.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953857 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5895996 1.46875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.6188965 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.250732 4.84375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1447754 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816772 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm11.708374 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292725 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.322021 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004272 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881104 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853394 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm10.219482 9.6875l-1.1875 0q2.734375 -4.375 2.734375 -8.75q0 -1.71875 -0.390625 -3.390625q-0.3125 -1.375 -0.875 -2.625q-0.359375 -0.828125 -1.46875 -2.734375l1.1875 0q1.703125 2.28125 2.53125 4.59375q0.6875 1.984375 0.6875 4.140625q0 2.46875 -0.9375 4.765625q-0.9375 2.296875 -2.28125 4.0z" fill-rule="nonzero"/><path fill="#4a4aff" d="m1472.1392 754.09186l287.3385 0l0 247.62207l-287.3385 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1472.1392 754.09186l287.3385 0l0 247.62207l-287.3385 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1563.2888 786.13184l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.378906 6.3125l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm13.535156 0l0 -1.828125q-1.453125 2.109375 -3.9375 2.109375q-1.109375 0 -2.0625 -0.421875q-0.953125 -0.421875 -1.421875 -1.0625q-0.453125 -0.640625 -0.640625 -1.5625q-0.140625 -0.625 -0.140625 -1.96875l0 -7.71875l2.109375 0l0 6.90625q0 1.65625 0.140625 2.234375q0.1875 0.828125 0.828125 1.3125q0.65625 0.46875 1.609375 0.46875q0.9375 0 1.765625 -0.484375q0.84375 -0.5 1.1875 -1.328125q0.34375 -0.84375 0.34375 -2.4375l0 -6.671875l2.109375 0l0 12.453125l-1.890625 0zm13.722656 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm16.363281 5.53125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.2773438 -4.328125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.175781 0q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm16.566406 4.328125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm2.0585938 1.890625l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm21.425781 0l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m1665.2179 1067.0526l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286255 -5.286255l-117.837036 0c-1.4019775 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.991333 0.991333 -1.5483398 2.3359375 -1.5483398 3.737915l0 21.144165c0 2.9194336 2.3666992 5.286133 5.286255 5.286133l117.837036 0c2.9195557 0 5.286255 -2.3666992 5.286255 -5.286133z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1665.2179 1067.0526l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286255 -5.286255l-117.837036 0c-1.4019775 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.991333 0.991333 -1.5483398 2.3359375 -1.5483398 3.737915l0 21.144165c0 2.9194336 2.3666992 5.286133 5.286255 5.286133l117.837036 0c2.9195557 0 5.286255 -2.3666992 5.286255 -5.286133z" fill-rule="evenodd"/><path fill="#000000" d="m1569.9677 1081.654l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.375 -1.953125q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610107 1.296875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.015625 3.546875l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0zm15.953125 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.94885254 -1.421875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#4a4aff" d="m1533.8398 1209.6035l197.66931 0l0 44.97632l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1533.8398 1209.6035l197.66931 0l0 44.97632l-197.66931 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1571.211 1236.5234l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266357 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323975 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.5720215 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm8.75 3.125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0zm7.9177246 -0.234375l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.84436 4.90625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519897 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm10.672607 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.99572754 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.688232 0q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm12.875732 3.375l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6052246 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1745.21 421.97113l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1745.21 421.97113l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m1804.6757 443.28424l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.578125 3.046875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.0390625 1.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1628.2518 227.64043l263.71643 0l0 37.574783l-263.71643 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1628.2518 227.64043l263.71643 0l0 37.574783l-263.71643 0z" fill-rule="evenodd"/><path fill="#000000" d="m1725.6871 248.16042l-1.90625 -6.21875l1.09375 0l0.984375 3.59375l0.375 1.328125q0.03125 -0.09375 0.328125 -1.28125l0.984375 -3.640625l1.078125 0l0.9375 3.609375l0.3125 1.1875l0.359375 -1.203125l1.0625 -3.59375l1.03125 0l-1.953125 6.21875l-1.09375 0l-0.984375 -3.734375l-0.25 -1.046875l-1.25 4.78125l-1.109375 0zm11.775391 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.845703 3.703125l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm5.798828 3.15625l0 -8.59375l3.234375 0q0.984375 0 1.578125 0.265625q0.59375 0.265625 0.921875 0.8125q0.34375 0.53125 0.34375 1.125q0 0.546875 -0.296875 1.03125q-0.296875 0.484375 -0.90625 0.78125q0.78125 0.234375 1.1875 0.796875q0.421875 0.546875 0.421875 1.296875q0 0.59375 -0.25 1.125q-0.25 0.515625 -0.625 0.796875q-0.375 0.28125 -0.953125 0.421875q-0.5625 0.140625 -1.375 0.140625l-3.28125 0zm1.140625 -4.984375l1.859375 0q0.75 0 1.078125 -0.09375q0.4375 -0.125 0.65625 -0.421875q0.21875 -0.3125 0.21875 -0.765625q0 -0.421875 -0.203125 -0.75q-0.203125 -0.328125 -0.59375 -0.4375q-0.375 -0.125 -1.296875 -0.125l-1.71875 0l0 2.59375zm0 3.96875l2.140625 0q0.546875 0 0.765625 -0.046875q0.40625 -0.0625 0.65625 -0.21875q0.265625 -0.171875 0.4375 -0.484375q0.171875 -0.3125 0.171875 -0.71875q0 -0.484375 -0.25 -0.84375q-0.234375 -0.359375 -0.671875 -0.5q-0.4375 -0.140625 -1.265625 -0.140625l-1.984375 0l0 2.953125zm6.7539062 1.015625l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm6.7755127 0l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm6.845703 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm8.173828 2.765625l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.595703 0q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm8.283203 2.171875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 0.9375l0 -8.59375l1.046875 0l0 3.078125q0.734375 -0.84375 1.859375 -0.84375q0.703125 0 1.203125 0.28125q0.515625 0.265625 0.734375 0.75q0.21875 0.46875 0.21875 1.390625l0 3.9375l-1.046875 0l0 -3.9375q0 -0.796875 -0.34375 -1.15625q-0.34375 -0.359375 -0.96875 -0.359375q-0.46875 0 -0.890625 0.25q-0.40625 0.234375 -0.59375 0.65625q-0.171875 0.40625 -0.171875 1.140625l0 3.40625l-1.046875 0z" fill-rule="nonzero"/></g></svg> \ No newline at end of file +<svg version="1.1" viewBox="0.0 0.0 1931.8503937007874 1390.5931758530185" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l1931.8503 0l0 1390.5931l-1931.8503 0l0 -1390.5931z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l1931.8503 0l0 1390.5931l-1931.8503 0z" fill-rule="evenodd"/><path fill="#efefef" d="m9.328085 225.08398l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m9.328085 225.08398l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path fill="#000000" d="m93.810814 257.124l-6.140625 -17.1875l3.765625 0l4.34375 12.71875l4.21875 -12.71875l3.671875 0l-6.15625 17.1875l-3.703125 0zm11.5859375 0l0 -17.1875l5.1875 0l3.125 11.71875l3.078125 -11.71875l5.203125 0l0 17.1875l-3.21875 0l0 -13.53125l-3.421875 13.53125l-3.328125 0l-3.40625 -13.53125l0 13.53125l-3.21875 0zm24.925774 0.296875l4.25 -17.765625l2.46875 0l-4.296875 17.765625l-2.421875 0zm23.101562 -6.609375l0 -2.90625l7.484375 0l0 6.84375q-1.09375 1.0625 -3.171875 1.875q-2.0625 0.796875 -4.171875 0.796875q-2.703125 0 -4.703125 -1.125q-2.0 -1.140625 -3.015625 -3.234375q-1.0 -2.109375 -1.0 -4.59375q0 -2.671875 1.125 -4.75q1.125 -2.09375 3.28125 -3.21875q1.65625 -0.84375 4.125 -0.84375q3.1875 0 4.984375 1.34375q1.8125 1.328125 2.328125 3.703125l-3.453125 0.640625q-0.359375 -1.265625 -1.359375 -2.0q-1.0 -0.734375 -2.5 -0.734375q-2.28125 0 -3.625 1.453125q-1.34375 1.4375 -1.34375 4.265625q0 3.0625 1.359375 4.59375q1.359375 1.53125 3.5625 1.53125q1.09375 0 2.1875 -0.421875q1.09375 -0.4375 1.890625 -1.046875l0 -2.171875l-3.984375 0zm18.855469 6.3125l0 -1.859375q-0.6875 0.984375 -1.796875 1.5625q-1.109375 0.578125 -2.328125 0.578125q-1.265625 0 -2.265625 -0.546875q-0.984375 -0.5625 -1.4375 -1.546875q-0.4375 -1.0 -0.4375 -2.765625l0 -7.875l3.296875 0l0 5.71875q0 2.625 0.171875 3.21875q0.1875 0.59375 0.65625 0.9375q0.484375 0.34375 1.234375 0.34375q0.84375 0 1.5 -0.453125q0.671875 -0.46875 0.921875 -1.15625q0.25 -0.6875 0.25 -3.359375l0 -5.25l3.28125 0l0 12.453125l-3.046875 0zm13.675781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm4.7851562 3.75l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm20.222656 -8.90625l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921875l0 4.390625l2.25 0zm8.269531 3.96875q0 -2.625 0.78125 -4.40625q0.59375 -1.3125 1.59375 -2.359375q1.015625 -1.046875 2.234375 -1.546875q1.59375 -0.671875 3.703125 -0.671875q3.796875 0 6.0625 2.359375q2.28125 2.34375 2.28125 6.546875q0 4.15625 -2.265625 6.515625q-2.25 2.34375 -6.03125 2.34375q-3.84375 0 -6.109375 -2.34375q-2.25 -2.34375 -2.25 -6.4375zm3.578125 -0.125q0 2.921875 1.34375 4.4375q1.34375 1.5 3.421875 1.5q2.078125 0 3.40625 -1.484375q1.328125 -1.5 1.328125 -4.5q0 -2.953125 -1.296875 -4.40625q-1.296875 -1.453125 -3.4375 -1.453125q-2.140625 0 -3.453125 1.484375q-1.3125 1.46875 -1.3125 4.421875zm14.917969 3.015625l3.375 -0.328125q0.296875 1.703125 1.21875 2.5q0.9375 0.796875 2.53125 0.796875q1.671875 0 2.515625 -0.703125q0.859375 -0.71875 0.859375 -1.671875q0 -0.609375 -0.359375 -1.03125q-0.359375 -0.421875 -1.25 -0.75q-0.609375 -0.203125 -2.78125 -0.75q-2.78125 -0.6875 -3.90625 -1.6875q-1.59375 -1.421875 -1.59375 -3.46875q0 -1.3125 0.75 -2.453125q0.75 -1.140625 2.140625 -1.734375q1.40625 -0.59375 3.390625 -0.59375q3.234375 0 4.859375 1.421875q1.640625 1.40625 1.71875 3.78125l-3.46875 0.140625q-0.21875 -1.3125 -0.953125 -1.890625q-0.734375 -0.59375 -2.203125 -0.59375q-1.5 0 -2.359375 0.625q-0.546875 0.40625 -0.546875 1.0625q0 0.609375 0.515625 1.046875q0.65625 0.546875 3.1875 1.15625q2.53125 0.59375 3.734375 1.234375q1.21875 0.640625 1.90625 1.75q0.6875 1.09375 0.6875 2.734375q0 1.46875 -0.828125 2.765625q-0.8125 1.28125 -2.3125 1.921875q-1.5 0.625 -3.75 0.625q-3.25 0 -5.0 -1.5q-1.75 -1.515625 -2.078125 -4.40625z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m918.6483 963.71655l394.01575 0l0 105.322876l-394.01575 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m918.6483 963.71655l394.01575 0l0 105.322876l-394.01575 0z" fill-rule="evenodd"/><path fill="#000000" d="m1073.8053 989.1678l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051025 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm10.375732 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292725 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.4938965 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm7.7663574 8.53125l0 -1.1875l10.859375 0l0 1.1875l-10.859375 0zm11.891357 0l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203857 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881104 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806519 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5269775 5.1875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.171875 -3.484375l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1021.31366 995.7475l188.685 0l0 21.45288l-188.685 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1022.4543 1002.96466l2.359436 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.562561 0l0 -9.671875zm16.197815 4.703125q0 -1.28125 0.625 -2.46875q0.625 -1.203125 1.78125 -1.828125q1.15625 -0.625 2.578125 -0.625q2.1875 0 3.59375 1.421875q1.40625 1.421875 1.40625 3.609375q0 2.1875 -1.421875 3.640625q-1.421875 1.4375 -3.5625 1.4375q-1.328125 0 -2.546875 -0.59375q-1.203125 -0.609375 -1.828125 -1.765625q-0.625 -1.171875 -0.625 -2.828125zm2.625 0.125q0 1.453125 0.671875 2.21875q0.6875 0.75 1.6875 0.75q1.0 0 1.671875 -0.75q0.6875 -0.765625 0.6875 -2.234375q0 -1.421875 -0.6875 -2.1875q-0.671875 -0.765625 -1.671875 -0.765625q-1.0 0 -1.6875 0.765625q-0.671875 0.765625 -0.671875 2.203125zm18.239746 4.84375l-2.390625 0l0 -1.421875q-0.59375 0.828125 -1.40625 1.234375q-0.796875 0.40625 -1.609375 0.40625q-1.671875 0 -2.859375 -1.34375q-1.1875 -1.34375 -1.1875 -3.75q0 -2.453125 1.15625 -3.734375q1.15625 -1.28125 2.921875 -1.28125q1.625 0 2.8125 1.34375l0 -4.8125l2.5625 0l0 13.359375zm-6.84375 -5.046875q0 1.546875 0.4375 2.234375q0.609375 1.015625 1.71875 1.015625q0.890625 0 1.5 -0.75q0.625 -0.765625 0.625 -2.25q0 -1.671875 -0.609375 -2.40625q-0.59375 -0.734375 -1.53125 -0.734375q-0.90625 0 -1.53125 0.734375q-0.609375 0.71875 -0.609375 2.15625zm14.958374 1.96875l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm4.4226074 -4.0l2.359375 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.5625 0l0 -9.671875zm16.588379 0l2.359375 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.5625 0l0 -9.671875zm18.697876 2.953125l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm13.84436 4.640625l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm4.505371 -6.71875l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm4.8132324 5.28125l2.921875 0.359375q0.0625 0.5 0.328125 0.6875q0.375 0.28125 1.15625 0.28125q1.0 0 1.5 -0.296875q0.328125 -0.203125 0.515625 -0.65625q0.109375 -0.3125 0.109375 -1.171875l0 -1.40625q-1.140625 1.5625 -2.890625 1.5625q-1.953125 0 -3.09375 -1.65625q-0.890625 -1.296875 -0.890625 -3.234375q0 -2.4375 1.171875 -3.71875q1.171875 -1.28125 2.90625 -1.28125q1.796875 0 2.96875 1.578125l0 -1.359375l2.390625 0l0 8.671875q0 1.71875 -0.28125 2.5625q-0.28125 0.84375 -0.796875 1.328125q-0.5 0.484375 -1.359375 0.75q-0.84375 0.28125 -2.15625 0.28125q-2.453125 0 -3.484375 -0.84375q-1.03125 -0.84375 -1.03125 -2.125q0 -0.140625 0.015625 -0.3125zm2.28125 -5.671875q0 1.53125 0.59375 2.25q0.59375 0.71875 1.46875 0.71875q0.9375 0 1.578125 -0.734375q0.65625 -0.734375 0.65625 -2.171875q0 -1.515625 -0.625 -2.234375q-0.609375 -0.734375 -1.5625 -0.734375q-0.921875 0 -1.515625 0.71875q-0.59375 0.71875 -0.59375 2.1875zm14.942871 1.953125l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm7.0788574 5.671875l-2.5625 0l0 -9.671875l2.375 0l0 1.375q0.609375 -0.984375 1.09375 -1.28125q0.484375 -0.3125 1.109375 -0.3125q0.875 0 1.6875 0.484375l-0.796875 2.234375q-0.640625 -0.421875 -1.203125 -0.421875q-0.53125 0 -0.90625 0.296875q-0.375 0.296875 -0.59375 1.078125q-0.203125 0.765625 -0.203125 3.234375l0 2.984375zm4.510254 -3.5625l0 -2.5625l5.03125 0l0 2.5625l-5.03125 0zm15.3063965 3.5625l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm8.192871 -3.078125l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm3.3913574 5.671875l3.484375 -4.984375l-3.34375 -4.6875l3.125 0l1.71875 2.65625l1.796875 -2.65625l3.015625 0l-3.28125 4.578125l3.578125 5.09375l-3.140625 0l-1.96875 -3.0l-1.984375 3.0l-3.0 0zm16.047607 -9.671875l0 2.03125l-1.75 0l0 3.90625q0 1.1875 0.046875 1.390625q0.046875 0.1875 0.21875 0.3125q0.1875 0.125 0.4375 0.125q0.359375 0 1.03125 -0.25l0.21875 2.0q-0.890625 0.375 -2.015625 0.375q-0.703125 0 -1.265625 -0.234375q-0.546875 -0.234375 -0.8125 -0.59375q-0.25 -0.375 -0.34375 -1.0q-0.09375 -0.453125 -0.09375 -1.8125l0 -4.21875l-1.171875 0l0 -2.03125l1.171875 0l0 -1.921875l2.578125 -1.5l0 3.421875l1.75 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m1209.9987 995.7475l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1021.31366 1013.84985l188.685 0l0 1.6799927l-188.685 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/third_party/modemmanager-next/;l%3D1?q%3Dmodemmanager%26ss%3Dpiper%252FGoogle%252Fchromeos_public&sa=D&source=editors&ust=1638577908180000&usg=AOvVaw3TEU2fwnxTqbVGtu0_JiI2" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1021.31366 994.71655l188.685 0l0 22.399963l-188.685 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#c9daf8" d="m383.7874 172.4672l1521.4802 0l0 442.51968l-1521.4802 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m383.7874 172.4672l1521.4802 0l0 442.51968l-1521.4802 0z" fill-rule="evenodd"/><path fill="#000000" d="m1111.9221 198.19469l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5625 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375 5.828125 -2.375q3.15625 0 5.125 1.859375q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.34375 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.375 0 2.375 -0.875q1.0 -0.890625 1.421875 -2.765625zm9.597656 -10.875l0 6.328125q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm14.535156 17.1875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm11.800781 -6.234375l3.03125 0l0 1.703125q1.625 -1.984375 3.875 -1.984375q1.203125 0 2.078125 0.5q0.875 0.484375 1.4375 1.484375q0.828125 -1.0 1.765625 -1.484375q0.953125 -0.5 2.03125 -0.5q1.375 0 2.3125 0.5625q0.953125 0.5625 1.421875 1.640625q0.34375 0.796875 0.34375 2.578125l0 7.953125l-3.296875 0l0 -7.109375q0 -1.859375 -0.328125 -2.390625q-0.46875 -0.703125 -1.40625 -0.703125q-0.703125 0 -1.3125 0.421875q-0.609375 0.421875 -0.875 1.234375q-0.265625 0.8125 -0.265625 2.5625l0 5.984375l-3.296875 0l0 -6.828125q0 -1.8125 -0.171875 -2.328125q-0.171875 -0.53125 -0.546875 -0.78125q-0.375 -0.265625 -1.0 -0.265625q-0.765625 0 -1.375 0.40625q-0.609375 0.40625 -0.875 1.1875q-0.265625 0.765625 -0.265625 2.5625l0 6.046875l-3.28125 0l0 -12.453125zm28.792969 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0z" fill-rule="nonzero"/><defs><linearGradient id="p.1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(22.75616333875044 0.0 0.0 22.75616333875044 0.0 0.0)" spreadMethod="pad" x1="50.0253847639223" y1="25.41507032009087" x2="33.93449513200751" y2="9.323885132124536"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.1)" d="m428.52756 555.8609l687.37 0l0 44.97638l-687.37 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m428.52756 555.8609l687.37 0l0 44.97638l-687.37 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m671.0997 565.5953l121.489136 0l0 15.32605l-121.489136 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m676.4903 575.12964l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0165405 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm6.2578125 2.21875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm9.062378 -0.15625l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm7.7093506 3.453125l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm10.865601 3.5l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm6.2578125 2.21875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm4.109192 -2.21875l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.1328125 2.0625l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.4281006 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9298706 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9610596 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.1017456 0.15625l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0z" fill-rule="nonzero"/><path fill="#000000" d="m797.32306 577.6609l0 -9.546875l3.28125 0q1.109375 0 1.703125 0.140625q0.8125 0.1875 1.390625 0.6875q0.765625 0.640625 1.140625 1.640625q0.375 0.984375 0.375 2.25q0 1.09375 -0.265625 1.9375q-0.25 0.828125 -0.65625 1.390625q-0.390625 0.546875 -0.859375 0.859375q-0.46875 0.3125 -1.140625 0.484375q-0.65625 0.15625 -1.53125 0.15625l-3.4375 0zm1.265625 -1.125l2.03125 0q0.9375 0 1.46875 -0.171875q0.546875 -0.1875 0.875 -0.5q0.4375 -0.453125 0.6875 -1.203125q0.25 -0.765625 0.25 -1.84375q0 -1.5 -0.5 -2.296875q-0.484375 -0.8125 -1.1875 -1.078125q-0.5 -0.203125 -1.625 -0.203125l-2.0 0l0 7.296875zm8.296997 1.125l0 -9.546875l3.59375 0q1.09375 0 1.75 0.296875q0.65625 0.28125 1.03125 0.890625q0.375 0.609375 0.375 1.265625q0 0.609375 -0.34375 1.15625q-0.328125 0.53125 -0.984375 0.859375q0.859375 0.25 1.328125 0.875q0.46875 0.609375 0.46875 1.4375q0 0.671875 -0.296875 1.25q-0.28125 0.578125 -0.703125 0.890625q-0.40625 0.3125 -1.03125 0.46875q-0.625 0.15625 -1.546875 0.15625l-3.640625 0zm1.265625 -5.53125l2.0625 0q0.84375 0 1.203125 -0.109375q0.484375 -0.140625 0.71875 -0.46875q0.25 -0.34375 0.25 -0.84375q0 -0.46875 -0.234375 -0.828125q-0.21875 -0.359375 -0.640625 -0.5q-0.421875 -0.140625 -1.453125 -0.140625l-1.90625 0l0 2.890625zm0 4.40625l2.375 0q0.609375 0 0.859375 -0.046875q0.4375 -0.078125 0.734375 -0.25q0.296875 -0.1875 0.484375 -0.53125q0.1875 -0.359375 0.1875 -0.8125q0 -0.53125 -0.28125 -0.921875q-0.265625 -0.40625 -0.75 -0.5625q-0.484375 -0.15625 -1.40625 -0.15625l-2.203125 0l0 3.28125zm12.0616455 1.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm17.78894 -1.28125l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.656372 3.34375l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9923706 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.6798096 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.6717529 -1.015625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" fill-rule="nonzero"/><path fill="#000099" d="m671.0997 578.5276l121.489075 0l0 1.1999512l-121.489075 0l0 -1.1999512z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/dbus/shill/?q%3Dchromeos%252Fdbus%252Fshill%252F%26ss%3Dchromium&sa=D&source=editors&ust=1638577908190000&usg=AOvVaw22yN5gsjrQuI5P92yA_mhH" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m671.0997 564.8609l121.489075 0l0 16.0l-121.489075 0l0 -16.0z" fill-rule="nonzero"/></a><defs><linearGradient id="p.2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(18.572973184015446 0.0 0.0 18.572973184015446 0.0 0.0)" spreadMethod="pad" x1="54.366384790409825" y1="24.411686394668724" x2="41.23343205387387" y2="11.278488561921765"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.2)" d="m591.33594 383.96326l348.97638 0l0 138.86615l-348.97638 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m591.33594 383.96326l348.97638 0l0 138.86615l-348.97638 0z" fill-rule="evenodd"/><path fill="#000000" d="m632.75385 408.32324l0 -11.453125l2.25 0l4.6875 7.640625l0 -7.640625l2.15625 0l0 11.453125l-2.328125 0l-4.609375 -7.46875l0 7.46875l-2.15625 0zm16.320312 -2.640625l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm7.7734375 -3.4375l0 1.75l-1.5 0l0 3.34375q0 1.015625 0.046875 1.1875q0.046875 0.15625 0.1875 0.265625q0.15625 0.109375 0.375 0.109375q0.3125 0 0.890625 -0.203125l0.1875 1.703125q-0.765625 0.328125 -1.734375 0.328125q-0.59375 0 -1.078125 -0.203125q-0.46875 -0.203125 -0.703125 -0.515625q-0.21875 -0.3125 -0.296875 -0.859375q-0.078125 -0.375 -0.078125 -1.546875l0 -3.609375l-1.0 0l0 -1.75l1.0 0l0 -1.65625l2.203125 -1.28125l0 2.9375l1.5 0zm3.078125 8.296875l-2.625 -8.296875l2.125 0l1.5625 5.4375l1.421875 -5.4375l2.125 0l1.375 5.4375l1.59375 -5.4375l2.15625 0l-2.65625 8.296875l-2.109375 0l-1.4375 -5.34375l-1.40625 5.34375l-2.125 0zm10.3828125 -4.265625q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.53125 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203125 1.21875 1.203125 3.09375q0 1.875 -1.21875 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.03125 -0.515625 -1.578125 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.25 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm10.1328125 4.15625l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625zm4.0546875 0l0 -11.453125l2.1875 0l0 6.078125l2.578125 -2.921875l2.703125 0l-2.84375 3.03125l3.046875 5.265625l-2.375 0l-2.078125 -3.734375l-1.03125 1.078125l0 2.65625l-2.1875 0zm8.9921875 0l0 -11.453125l2.3125 0l0 4.5l4.53125 0l0 -4.5l2.3125 0l0 11.453125l-2.3125 0l0 -5.015625l-4.53125 0l0 5.015625l-2.3125 0zm13.1796875 -5.765625l-2.0 -0.359375q0.34375 -1.203125 1.15625 -1.78125q0.828125 -0.578125 2.4375 -0.578125q1.46875 0 2.1875 0.34375q0.71875 0.34375 1.015625 0.890625q0.296875 0.53125 0.296875 1.953125l-0.03125 2.5625q0 1.09375 0.109375 1.625q0.109375 0.515625 0.390625 1.109375l-2.171875 0q-0.078125 -0.21875 -0.203125 -0.65625q-0.0625 -0.1875 -0.078125 -0.25q-0.5625 0.546875 -1.203125 0.828125q-0.640625 0.265625 -1.375 0.265625q-1.28125 0 -2.015625 -0.6875q-0.734375 -0.703125 -0.734375 -1.765625q0 -0.703125 0.328125 -1.25q0.34375 -0.5625 0.9375 -0.84375q0.609375 -0.296875 1.75 -0.515625q1.546875 -0.296875 2.140625 -0.546875l0 -0.21875q0 -0.625 -0.3125 -0.890625q-0.3125 -0.28125 -1.1875 -0.28125q-0.578125 0 -0.90625 0.234375q-0.328125 0.234375 -0.53125 0.8125zm2.9375 1.78125q-0.421875 0.140625 -1.34375 0.34375q-0.90625 0.1875 -1.1875 0.375q-0.4375 0.296875 -0.4375 0.765625q0 0.46875 0.34375 0.8125q0.34375 0.328125 0.875 0.328125q0.59375 0 1.140625 -0.390625q0.390625 -0.296875 0.515625 -0.734375q0.09375 -0.28125 0.09375 -1.0625l0 -0.4375zm11.8671875 3.984375l-2.203125 0l0 -4.234375q0 -1.34375 -0.140625 -1.734375q-0.140625 -0.40625 -0.453125 -0.625q-0.3125 -0.21875 -0.765625 -0.21875q-0.5625 0 -1.015625 0.3125q-0.453125 0.3125 -0.625 0.828125q-0.171875 0.515625 -0.171875 1.90625l0 3.765625l-2.1875 0l0 -8.296875l2.03125 0l0 1.21875q1.09375 -1.40625 2.734375 -1.40625q0.734375 0 1.328125 0.265625q0.609375 0.25 0.90625 0.65625q0.3125 0.40625 0.4375 0.921875q0.125 0.515625 0.125 1.484375l0 5.15625zm9.8359375 0l-2.046875 0l0 -1.21875q-0.5 0.703125 -1.203125 1.0625q-0.6875 0.34375 -1.390625 0.34375q-1.421875 0 -2.453125 -1.15625q-1.015625 -1.15625 -1.015625 -3.21875q0 -2.109375 0.984375 -3.203125q1.0 -1.09375 2.515625 -1.09375q1.390625 0 2.40625 1.15625l0 -4.125l2.203125 0l0 11.453125zm-5.859375 -4.328125q0 1.328125 0.359375 1.921875q0.53125 0.859375 1.484375 0.859375q0.765625 0 1.296875 -0.640625q0.53125 -0.65625 0.53125 -1.9375q0 -1.421875 -0.515625 -2.046875q-0.515625 -0.640625 -1.328125 -0.640625q-0.78125 0 -1.3125 0.625q-0.515625 0.625 -0.515625 1.859375zm8.0234375 4.328125l0 -11.453125l2.1875 0l0 11.453125l-2.1875 0zm9.2421875 -2.640625l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm6.0703125 4.859375l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625z" fill-rule="nonzero"/><path fill="#000000" d="m762.457 411.69824q-1.171875 -1.46875 -1.984375 -3.4375q-0.796875 -1.984375 -0.796875 -4.09375q0 -1.859375 0.609375 -3.5625q0.703125 -1.96875 2.171875 -3.9375l1.0 0q-0.9375 1.625 -1.25 2.328125q-0.46875 1.078125 -0.75 2.25q-0.328125 1.453125 -0.328125 2.9375q0 3.75 2.328125 7.515625l-1.0 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m764.0351 393.83887l130.71875 0l0 18.398438l-130.71875 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m770.50385 405.27637l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8828125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.3046875 0.796875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4140625 1.671875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm7.5 2.6875l3.328125 -11.859375l1.125 0l-3.3125 11.859375l-1.140625 0zm5.5078125 -0.203125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m896.7382 411.69824l-1.015625 0q2.34375 -3.765625 2.34375 -7.515625q0 -1.46875 -0.34375 -2.921875q-0.265625 -1.171875 -0.734375 -2.25q-0.3125 -0.703125 -1.265625 -2.34375l1.015625 0q1.46875 1.96875 2.171875 3.9375q0.59375 1.703125 0.59375 3.5625q0 2.109375 -0.8125 4.09375q-0.796875 1.96875 -1.953125 3.4375z" fill-rule="nonzero"/><path fill="#000099" d="m764.0351 409.36325l130.71875 0l0 1.4400024l-130.71875 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#000000" d="m644.957 442.30762l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9453125 4.15625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm12.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm13.96875 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.5625 3.046875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.0390625 1.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.0 0l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm14.234375 -0.1875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm16.070312 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm17.828125 1.109375l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm11.1953125 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.375 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm8.40625 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m860.5429 431.83887l35.554688 0l0 18.398438l-35.554688 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m861.32416 440.74512q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm11.3203125 5.5625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm19.742188 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875z" fill-rule="nonzero"/><path fill="#000099" d="m860.5429 447.36325l35.554688 0l0 1.4400024l-35.554688 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#000000" d="m615.3046 462.27637l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm9.2265625 0l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.296875l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4453125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm16.070312 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm12.078125 0.46875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm11.015625 3.6875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8984375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5234375 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.9453125 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm13.9375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.2734375 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm12.40625 7.328125l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6171875 4.109375l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm10.2734375 4.15625l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9296875 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.6328125 1.46875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm17.6875 3.921875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm13.453125 1.125l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.0 2.015625q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm9.0078125 1.125l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 3.046875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875z" fill-rule="nonzero"/><path fill="#000000" d="m608.8984 481.83887l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 2.484375l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.0703125 1.625l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 2.484375l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.3671875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm5.296875 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm8.21875 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm11.015625 3.6875l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8984375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5234375 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm13.4375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm9.2265625 0l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.296875l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4453125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm16.070312 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm15.484375 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm12.265625 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm5.296875 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m744.5546 499.30762l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm3.2109375 4.015625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8828125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 4.953125l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/network/&sa=D&source=editors&ust=1638577908205000&usg=AOvVaw3RF8_-dncJ_vqG_RuGuF21" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m764.0351 392.96326l130.71875 0l0 19.200012l-130.71875 0l0 -19.200012z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:components/onc/docs/onc_spec.md?q%3Donc_spec.md%26ss%3Dchromium&sa=D&source=editors&ust=1638577908205000&usg=AOvVaw1LrGntAsQ_eaS6itTnk7eG" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m860.5429 430.96326l35.554688 0l0 19.200012l-35.554688 0l0 -19.200012z" fill-rule="nonzero"/></a><path fill="#000000" fill-opacity="0.0" d="m972.25195 367.22864l0.06298828 -0.9763794" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m972.25195 367.22864l0.06298828 -0.9763794" fill-rule="evenodd"/><path fill="#6d9eeb" d="m428.5223 673.2756l687.37 0l0 224.62994l-687.37 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m428.5223 673.2756l687.37 0l0 224.62994l-687.37 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m746.8714 683.58905l50.671875 0l0 27.597656l-50.671875 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m747.7464 699.72186l3.375 -0.328125q0.296875 1.703125 1.21875 2.5q0.9375 0.796875 2.53125 0.796875q1.671875 0 2.515625 -0.703125q0.859375 -0.71875 0.859375 -1.671875q0 -0.609375 -0.359375 -1.03125q-0.359375 -0.421875 -1.25 -0.75q-0.609375 -0.203125 -2.78125 -0.75q-2.78125 -0.6875 -3.90625 -1.6875q-1.59375 -1.421875 -1.59375 -3.46875q0 -1.3125 0.75 -2.453125q0.75 -1.140625 2.140625 -1.734375q1.40625 -0.59375 3.390625 -0.59375q3.234375 0 4.859375 1.421875q1.640625 1.40625 1.71875 3.78125l-3.46875 0.140625q-0.21875 -1.3125 -0.953125 -1.890625q-0.734375 -0.59375 -2.203125 -0.59375q-1.5 0 -2.359375 0.625q-0.546875 0.40625 -0.546875 1.0625q0 0.609375 0.515625 1.046875q0.65625 0.546875 3.1875 1.15625q2.53125 0.59375 3.734375 1.234375q1.21875 0.640625 1.90625 1.75q0.6875 1.09375 0.6875 2.734375q0 1.46875 -0.828125 2.765625q-0.8125 1.28125 -2.3125 1.921875q-1.5 0.625 -3.75 0.625q-3.25 0 -5.0 -1.5q-1.75 -1.515625 -2.078125 -4.40625zm20.132812 -11.59375l0 6.328125q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm11.378906 3.046875l0 -3.046875l3.296875 0l0 3.046875l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm6.6679688 0l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm6.6679688 0l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m797.5433 683.58905l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m746.8714 706.8756l50.671875 0l0 2.1599731l-50.671875 0l0 -2.1599731z" fill-rule="nonzero"/><path fill="#000000" d="m468.4378 745.6356l0 -11.453125l5.078125 0q1.53125 0 2.328125 0.3125q0.796875 0.296875 1.265625 1.078125q0.484375 0.78125 0.484375 1.734375q0 1.21875 -0.796875 2.0625q-0.78125 0.828125 -2.4375 1.046875q0.609375 0.296875 0.921875 0.578125q0.65625 0.609375 1.25 1.515625l2.0 3.125l-1.90625 0l-1.515625 -2.390625q-0.671875 -1.03125 -1.109375 -1.578125q-0.421875 -0.546875 -0.765625 -0.765625q-0.328125 -0.21875 -0.6875 -0.296875q-0.25 -0.0625 -0.84375 -0.0625l-1.75 0l0 5.09375l-1.515625 0zm1.515625 -6.40625l3.25 0q1.046875 0 1.625 -0.203125q0.59375 -0.21875 0.890625 -0.6875q0.3125 -0.484375 0.3125 -1.03125q0 -0.8125 -0.59375 -1.328125q-0.59375 -0.53125 -1.859375 -0.53125l-3.625 0l0 3.78125zm15.5078125 3.734375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 5.671875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.1015625 -0.046875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 -7.359375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.5859375 4.21875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm12.609375 4.953125l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm15.1953125 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.0625 -1.109375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm9.2265625 0l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.296875l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4453125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.6328125 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm14.609375 4.296875l-3.03125 -11.453125l1.546875 0l1.75 7.5q0.28125 1.1875 0.484375 2.34375q0.4375 -1.828125 0.515625 -2.109375l2.171875 -7.734375l1.828125 0l1.640625 5.796875q0.625 2.15625 0.890625 4.046875q0.21875 -1.078125 0.578125 -2.484375l1.796875 -7.359375l1.515625 0l-3.140625 11.453125l-1.453125 0l-2.421875 -8.734375q-0.296875 -1.09375 -0.359375 -1.34375q-0.171875 0.796875 -0.328125 1.34375l-2.4375 8.734375l-1.546875 0zm12.9296875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.8046875 0l0 -11.453125l7.734375 0l0 1.34375l-6.21875 0l0 3.546875l5.375 0l0 1.359375l-5.375 0l0 5.203125l-1.515625 0zm9.5234375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.9140625 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm16.875 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.8828125 1.34375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8046875 4.953125l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8203125 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm8.734375 0l0 -11.453125l8.28125 0l0 1.34375l-6.765625 0l0 3.515625l6.34375 0l0 1.34375l-6.34375 0l0 3.890625l7.03125 0l0 1.359375l-8.546875 0zm13.53125 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7421875 1.265625l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm8.25 -5.578125q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm11.1640625 8.75l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm13.3046875 1.4375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm12.3515625 0l-4.4375 -11.453125l1.640625 0l2.96875 8.3125q0.359375 1.0 0.609375 1.875q0.265625 -0.9375 0.609375 -1.875l3.09375 -8.3125l1.546875 0l-4.484375 11.453125l-1.546875 0zm7.390625 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm9.140625 6.015625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm11.7578125 0l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm13.9375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.273499 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.000061 0 -1.828186 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859436 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.437561 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578186 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.93756104 0 -1.562561 0.765625q-0.625 0.765625 -0.625 2.421875zm12.515686 4.140625l0 -11.453125l1.515625 0l0 10.09375l5.640625 0l0 1.359375l-7.15625 0zm15.7890625 -1.359375l0 1.359375l-7.578125 0q-0.015625 -0.515625 0.171875 -0.984375q0.28125 -0.765625 0.921875 -1.515625q0.640625 -0.75 1.84375 -1.734375q1.859375 -1.53125 2.515625 -2.421875q0.65625 -0.90625 0.65625 -1.703125q0 -0.828125 -0.59375 -1.40625q-0.59375 -0.578125 -1.5625 -0.578125q-1.015625 0 -1.625 0.609375q-0.609375 0.609375 -0.609375 1.6875l-1.453125 -0.140625q0.15625 -1.625 1.125 -2.46875q0.96875 -0.84375 2.59375 -0.84375q1.65625 0 2.609375 0.921875q0.96875 0.90625 0.96875 2.25q0 0.6875 -0.28125 1.359375q-0.28125 0.65625 -0.9375 1.390625q-0.65625 0.734375 -2.171875 2.015625q-1.265625 1.0625 -1.625 1.453125q-0.359375 0.375 -0.59375 0.75l5.625 0zm4.9921875 1.359375l0 -10.109375l-3.78125 0l0 -1.34375l9.078125 0l0 1.34375l-3.78125 0l0 10.109375l-1.515625 0zm6.8515625 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm7.921875 6.21875l3.328125 -11.859375l1.125 0l-3.3125 11.859375l-1.140625 0zm5.9453125 -0.203125l0 -11.453125l1.515625 0l0 11.453125l-1.515625 0zm4.1796875 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.640625 2.328125l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.6875 1.015625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm10.4921875 3.046875l-4.4375 -11.453125l1.640625 0l2.96875 8.3125q0.359375 1.0 0.609375 1.875q0.265625 -0.9375 0.609375 -1.875l3.09375 -8.3125l1.546875 0l-4.484375 11.453125l-1.546875 0zm7.390625 0l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm9.140625 6.015625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm11.7890625 0l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><path fill="#000000" d="m640.0472 764.6356l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.96875 6.015625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm10.2734375 4.15625l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9296875 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.6328125 1.46875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm13.0078125 2.484375l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm8.0 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.6328125 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm11.875 1.8125l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm15.34375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm20.765625 0.140625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm3.2109375 4.015625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm8.8828125 0l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 4.953125l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/README.md&sa=D&source=editors&ust=1638577908213000&usg=AOvVaw0zvtzR9Rp3BvTXJ5t-eH42" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m746.8714 682.2756l50.671875 0l0 28.799988l-50.671875 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m1156.1908 674.91077l240.85034 0l0 138.86615l-240.85034 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1156.1908 674.91077l240.85034 0l0 138.86615l-240.85034 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1232.5886 685.2242l88.05469 0l0 27.597656l-88.05469 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m1234.3542 706.95074l0 -17.1875l3.46875 0l0 6.765625l6.796875 0l0 -6.765625l3.46875 0l0 17.1875l-3.46875 0l0 -7.515625l-6.796875 0l0 7.515625l-3.46875 0zm24.503906 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm9.097656 7.296875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.9492188 -12.453125l3.03125 0l0 1.703125q1.625 -1.984375 3.875 -1.984375q1.203125 0 2.078125 0.5q0.875 0.484375 1.4375 1.484375q0.828125 -1.0 1.765625 -1.484375q0.953125 -0.5 2.03125 -0.5q1.375 0 2.3125 0.5625q0.953125 0.5625 1.421875 1.640625q0.34375 0.796875 0.34375 2.578125l0 7.953125l-3.296875 0l0 -7.109375q0 -1.859375 -0.328125 -2.390625q-0.46875 -0.703125 -1.40625 -0.703125q-0.703125 0 -1.3125 0.421875q-0.609375 0.421875 -0.875 1.234375q-0.265625 0.8125 -0.265625 2.5625l0 5.984375l-3.296875 0l0 -6.828125q0 -1.8125 -0.171875 -2.328125q-0.171875 -0.53125 -0.546875 -0.78125q-0.375 -0.265625 -1.0 -0.265625q-0.765625 0 -1.375 0.40625q-0.609375 0.40625 -0.875 1.1875q-0.265625 0.765625 -0.265625 2.5625l0 6.046875l-3.28125 0l0 -12.453125zm28.792969 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm4.7851562 3.75l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1320.6433 685.2242l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m1232.5886 708.51074l88.05469 0l0 2.1600342l-88.05469 0l0 -2.1600342z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/hermes/README.md&sa=D&source=editors&ust=1638577908215000&usg=AOvVaw0pm3C9IcD3P84ALeLgB-sr" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1232.5886 683.91077l88.05469 0l0 28.799988l-88.05469 0l0 -28.799988z" fill-rule="nonzero"/></a><defs><linearGradient id="p.3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.216496493233654 0.0 0.0 14.216496493233654 0.0 0.0)" spreadMethod="pad" x1="99.85085736086143" y1="40.61493112550267" x2="89.79836859699044" y2="30.56225774006074"><stop offset="0.0" stop-color="#8e7cc3"/><stop offset="0.47" stop-color="#b4a7d6"/><stop offset="0.54" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.3)" d="m1156.1908 554.9134l240.85034 0l0 44.97638l-240.85034 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1156.1908 554.9134l240.85034 0l0 44.97638l-240.85034 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1177.575 564.5701l125.390625 0l0 13.798828l-125.390625 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m1182.4343 573.15216l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.9375 2.28125l0 -8.59375l1.046875 0l0 3.078125q0.734375 -0.84375 1.859375 -0.84375q0.703125 0 1.203125 0.28125q0.515625 0.265625 0.734375 0.75q0.21875 0.46875 0.21875 1.390625l0 3.9375l-1.046875 0l0 -3.9375q0 -0.796875 -0.34375 -1.15625q-0.34375 -0.359375 -0.96875 -0.359375q-0.46875 0 -0.890625 0.25q-0.40625 0.234375 -0.59375 0.65625q-0.171875 0.40625 -0.171875 1.140625l0 3.40625l-1.046875 0zm6.658203 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.6210938 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.246094 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.486328 0.59375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.564453 1.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm5.625 2.0l2.484375 -8.875l0.84375 0l-2.484375 8.875l-0.84375 0zm8.162109 -0.140625l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm6.939453 3.109375l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm9.798828 3.15625l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.1738281 -1.859375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm5.625 2.0l2.484375 -8.875l0.84375 0l-2.484375 8.875l-0.84375 0zm4.1308594 -0.140625l0 -8.59375l1.046875 0l0 3.078125q0.734375 -0.84375 1.859375 -0.84375q0.703125 0 1.203125 0.28125q0.515625 0.265625 0.734375 0.75q0.21875 0.46875 0.21875 1.390625l0 3.9375l-1.046875 0l0 -3.9375q0 -0.796875 -0.34375 -1.15625q-0.34375 -0.359375 -0.96875 -0.359375q-0.46875 0 -0.890625 0.25q-0.40625 0.234375 -0.59375 0.65625q-0.171875 0.40625 -0.171875 1.140625l0 3.40625l-1.046875 0zm10.923828 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.0117188 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm14.246094 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000000" d="m1307.2214 575.4334l0 -8.59375l2.96875 0q1.0 0 1.53125 0.125q0.734375 0.171875 1.25 0.609375q0.6875 0.578125 1.015625 1.484375q0.34375 0.890625 0.34375 2.03125q0 0.984375 -0.234375 1.734375q-0.21875 0.75 -0.578125 1.25q-0.359375 0.5 -0.796875 0.78125q-0.421875 0.28125 -1.015625 0.4375q-0.59375 0.140625 -1.375 0.140625l-3.109375 0zm1.140625 -1.015625l1.828125 0q0.859375 0 1.34375 -0.15625q0.484375 -0.15625 0.765625 -0.453125q0.40625 -0.390625 0.625 -1.078125q0.234375 -0.6875 0.234375 -1.65625q0 -1.34375 -0.453125 -2.0625q-0.4375 -0.734375 -1.0625 -0.984375q-0.46875 -0.171875 -1.46875 -0.171875l-1.8125 0l0 6.5625zm7.4785156 1.015625l0 -8.59375l3.234375 0q0.984375 0 1.578125 0.265625q0.59375 0.265625 0.921875 0.8125q0.34375 0.53125 0.34375 1.125q0 0.546875 -0.296875 1.03125q-0.296875 0.484375 -0.90625 0.78125q0.78125 0.234375 1.1875 0.796875q0.421875 0.546875 0.421875 1.296875q0 0.59375 -0.25 1.125q-0.25 0.515625 -0.625 0.796875q-0.375 0.28125 -0.953125 0.421875q-0.5625 0.140625 -1.375 0.140625l-3.28125 0zm1.140625 -4.984375l1.859375 0q0.75 0 1.078125 -0.09375q0.4375 -0.125 0.65625 -0.421875q0.21875 -0.3125 0.21875 -0.765625q0 -0.421875 -0.203125 -0.75q-0.203125 -0.328125 -0.59375 -0.4375q-0.375 -0.125 -1.296875 -0.125l-1.71875 0l0 2.59375zm0 3.96875l2.140625 0q0.546875 0 0.765625 -0.046875q0.40625 -0.0625 0.65625 -0.21875q0.265625 -0.171875 0.4375 -0.484375q0.171875 -0.3125 0.171875 -0.71875q0 -0.484375 -0.25 -0.84375q-0.234375 -0.359375 -0.671875 -0.5q-0.4375 -0.140625 -1.265625 -0.140625l-1.984375 0l0 2.953125zm10.863281 1.015625l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.1738281 -1.859375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm16.021484 -1.15625l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.3691406 3.015625l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm2.6972656 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.9160156 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm8.970703 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6152344 -0.921875l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><path fill="#000099" d="m1177.575 576.2134l125.390625 0l0 1.0800171l-125.390625 0l0 -1.0800171z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/dbus/hermes/&sa=D&source=editors&ust=1638577908219000&usg=AOvVaw2ujobYXoJulWxne0OMffYI" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1177.575 563.9134l125.390625 0l0 14.400024l-125.390625 0l0 -14.400024z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m704.0971 633.55914l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l125.64807 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.991333 0.99139404 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194946 -2.3666992 5.286194 -5.286194 5.286194l-125.64807 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m704.0971 633.55914l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l125.64807 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.991333 0.99139404 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194946 -2.3666992 5.286194 -5.286194 5.286194l-125.64807 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286194z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m744.80914 636.86566l49.60962 0l0 15.325989l-49.60962 0l0 -15.325989z" fill-rule="nonzero"/><path fill="#000099" d="m745.9654 648.9312l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.406128 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9923706 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9454346 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm11.383667 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.093811 0.109375l-0.18756104 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.406128 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.4923706 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 3.46875l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm11.430542 0l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0z" fill-rule="nonzero"/><path fill="#000000" d="m794.84064 641.13434l0.296875 -0.921875q1.03125 0.375 1.5 0.640625q-0.125 -1.1875 -0.125 -1.625l0.9375 0q-0.015625 0.640625 -0.140625 1.609375q0.65625 -0.328125 1.53125 -0.625l0.296875 0.921875q-0.828125 0.28125 -1.625 0.375q0.40625 0.34375 1.125 1.21875l-0.78125 0.5625q-0.375 -0.515625 -0.890625 -1.40625q-0.484375 0.921875 -0.84375 1.40625l-0.765625 -0.5625q0.75 -0.921875 1.078125 -1.21875q-0.84375 -0.171875 -1.59375 -0.375z" fill-rule="nonzero"/><path fill="#000099" d="m744.80914 649.7979l49.60962 0l0 1.2000122l-49.60962 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/doc/manager-api.txt?q%3Dmanager-api.txt%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908221000&usg=AOvVaw0tDQt2hh5bFGWyCKJJIcyj" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m744.80914 636.1312l49.60962 0l0 16.0l-49.60962 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1156.1908 478.6614l240.85034 0l0 59.716522l-240.85034 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1156.1908 478.6614l240.85034 0l0 59.716522l-240.85034 0z" fill-rule="evenodd"/><path fill="#000000" d="m1237.9949 499.0058l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.8828125 1.34375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8046875 4.953125l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.0 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.6875 1.015625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.8203125 1.265625l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4609375 3.1875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375z" fill-rule="nonzero"/><defs><linearGradient id="p.4" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.461889909062105 0.0 0.0 14.461889909062105 0.0 0.0)" spreadMethod="pad" x1="79.93039935274531" y1="21.668886568203416" x2="69.70439250989592" y2="11.442692564966935"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.4)" d="m878.9525 300.8479l0 0c0 -3.4587402 2.803833 -6.2626038 6.2625732 -6.2626038l245.67957 0c1.6608887 0 3.2537842 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342285 2.7673645 1.8342285 4.428314l0 25.049622c0 3.4587097 -2.803833 6.2625732 -6.2625732 6.2625732l-245.67957 0c-3.4587402 0 -6.2625732 -2.8038635 -6.2625732 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m878.9525 300.8479l0 0c0 -3.4587402 2.803833 -6.2626038 6.2625732 -6.2626038l245.67957 0c1.6608887 0 3.2537842 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342285 2.7673645 1.8342285 4.428314l0 25.049622c0 3.4587097 -2.803833 6.2625732 -6.2625732 6.2625732l-245.67957 0c-3.4587402 0 -6.2625732 -2.8038635 -6.2625732 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m910.274 306.15396l195.5617 0l0 15.32605l-195.5617 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m915.6646 315.6883l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0164795 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836853 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374817 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm2.421753 1.046875l-2.125 -6.90625l1.21875 0l1.09375 3.984375l0.421875 1.484375q0.015625 -0.109375 0.359375 -1.421875l1.09375 -4.046875l1.203125 0l1.03125 4.0l0.34375 1.328125l0.40625 -1.34375l1.171875 -3.984375l1.140625 0l-2.15625 6.90625l-1.21875 0l-1.09375 -4.140625l-0.265625 -1.171875l-1.40625 5.3125l-1.21875 0zm7.906433 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4696045 0l0 -9.546875l1.171875 0l0 5.453125l2.765625 -2.8125l1.515625 0l-2.640625 2.5625l2.90625 4.34375l-1.4375 0l-2.28125 -3.53125l-0.828125 0.796875l0 2.734375l-1.171875 0zm5.5703125 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm13.006226 -5.1875l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm7.6937256 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.437378 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.7266846 0.578125l1.140625 0.15625q0.078125 0.53125 0.40625 0.78125q0.4375 0.3125 1.1875 0.3125q0.8125 0 1.25 -0.328125q0.453125 -0.3125 0.609375 -0.90625q0.09375 -0.359375 0.078125 -1.5q-0.765625 0.90625 -1.90625 0.90625q-1.4375 0 -2.21875 -1.03125q-0.78125 -1.03125 -0.78125 -2.46875q0 -0.984375 0.359375 -1.8125q0.359375 -0.84375 1.03125 -1.296875q0.6875 -0.453125 1.609375 -0.453125q1.21875 0 2.015625 0.984375l0 -0.828125l1.078125 0l0 5.96875q0 1.609375 -0.328125 2.28125q-0.328125 0.6875 -1.046875 1.078125q-0.703125 0.390625 -1.75 0.390625q-1.234375 0 -2.0 -0.5625q-0.75 -0.5625 -0.734375 -1.671875zm0.984375 -4.15625q0 1.359375 0.53125 1.984375q0.546875 0.625 1.359375 0.625q0.796875 0 1.34375 -0.625q0.546875 -0.625 0.546875 -1.953125q0 -1.265625 -0.5625 -1.90625q-0.5625 -0.640625 -1.359375 -0.640625q-0.765625 0 -1.3125 0.640625q-0.546875 0.625 -0.546875 1.875zm6.9749756 3.578125l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0079346 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1105.8357 306.15396l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m910.274 319.0862l195.5617 0l0 1.2000122l-195.5617 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/services/network_config/public/mojom/cros_network_config.mojom?q%3Dchromeos.network_config.mojom%2520%26ss%3Dchromium&sa=D&source=editors&ust=1638577908228000&usg=AOvVaw1Ze-2zSCqY2-wFonj4JQiW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m910.274 305.41956l195.5617 0l0 16.0l-195.5617 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m958.3438 1280.937l498.48822 0l0 101.03931l-498.48822 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m958.3438 1280.937l498.48822 0l0 101.03931l-498.48822 0z" fill-rule="evenodd"/><path fill="#000000" d="m978.31256 1333.6892l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.363586 1.578125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1448364 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519775 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.0007324 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504211 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm11.567871 0l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm14.7751465 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563232 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.020874 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292725 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.322021 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004272 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881104 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853394 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m1224.6273 1296.9528l175.9685 0l0 69.00781l-175.9685 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1224.6273 1296.9528l175.9685 0l0 69.00781l-175.9685 0z" fill-rule="evenodd"/><path fill="#000000" d="m1234.4711 1319.5759l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm13.3342285 4.296875l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.8394775 0l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm30.302246 -4.6875l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.051025 3.5q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.494019 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm13.230835 5.0625l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0zm18.225952 -3.34375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm18.110107 -7.59375l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.0042725 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm14.417603 -4.6875l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm13.473022 0l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875z" fill-rule="nonzero"/><path fill="#dd7e6b" d="m610.7297 966.22046l258.2047 0l0 101.03943l-258.2047 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m610.7297 966.22046l258.2047 0l0 101.03943l-258.2047 0z" fill-rule="evenodd"/><path fill="#000000" d="m697.98114 991.6717l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm10.375732 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1291504 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.4939575 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm7.7663574 8.53125l0 -1.1875l10.859375 0l0 1.1875l-10.859375 0zm11.891296 0l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203857 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.8063965 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5270996 5.1875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.171875 -3.484375l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m669.8574 998.25146l139.94922 0l0 21.45288l-139.94922 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m672.99805 1015.14044l-3.0625 -9.671875l2.484375 0l1.8125 6.34375l1.671875 -6.34375l2.46875 0l1.609375 6.34375l1.859375 -6.34375l2.515625 0l-3.109375 9.671875l-2.453125 0l-1.671875 -6.21875l-1.640625 6.21875l-2.484375 0zm12.636414 -9.671875l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm10.849121 -1.71875l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm3.5319824 8.328125l0 -1.65625l10.640625 0l0 1.65625l-10.640625 0zm10.985046 -6.453125l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm17.641357 2.765625l0 -1.453125q-0.53125 0.78125 -1.390625 1.234375q-0.859375 0.4375 -1.8125 0.4375q-0.96875 0 -1.75 -0.421875q-0.765625 -0.4375 -1.125 -1.203125q-0.34375 -0.78125 -0.34375 -2.140625l0 -6.125l2.5625 0l0 4.4375q0 2.046875 0.140625 2.515625q0.140625 0.453125 0.515625 0.71875q0.375 0.265625 0.953125 0.265625q0.65625 0 1.171875 -0.359375q0.515625 -0.359375 0.703125 -0.890625q0.203125 -0.53125 0.203125 -2.609375l0 -4.078125l2.546875 0l0 9.671875l-2.375 0zm4.958496 -9.671875l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm8.864746 -4.671875l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm8.94281 5.0l0 -13.359375l2.5625 0l0 13.359375l-2.5625 0zm5.1833496 -10.984375l0 -2.375l2.5625 0l0 2.375l-2.5625 0zm0 10.984375l0 -9.671875l2.5625 0l0 9.671875l-2.5625 0zm13.620789 -6.8125l-2.53125 0.453125q-0.125 -0.75 -0.578125 -1.125q-0.453125 -0.390625 -1.171875 -0.390625q-0.953125 0 -1.53125 0.65625q-0.5625 0.65625 -0.5625 2.203125q0 1.734375 0.578125 2.4375q0.578125 0.703125 1.546875 0.703125q0.734375 0 1.203125 -0.40625q0.46875 -0.421875 0.65625 -1.421875l2.515625 0.421875q-0.390625 1.734375 -1.515625 2.625q-1.109375 0.875 -2.96875 0.875q-2.125 0 -3.390625 -1.328125q-1.25 -1.34375 -1.25 -3.71875q0 -2.390625 1.265625 -3.71875q1.265625 -1.34375 3.421875 -1.34375q1.765625 0 2.796875 0.765625q1.046875 0.75 1.515625 2.3125zm3.8444824 0.09375l-2.328125 -0.421875q0.40625 -1.40625 1.359375 -2.078125q0.953125 -0.671875 2.84375 -0.671875q1.703125 0 2.546875 0.40625q0.84375 0.40625 1.171875 1.03125q0.34375 0.625 0.34375 2.28125l-0.015625 3.0q0 1.265625 0.109375 1.875q0.125 0.609375 0.46875 1.296875l-2.53125 0q-0.109375 -0.25 -0.25 -0.75q-0.0625 -0.234375 -0.09375 -0.3125q-0.65625 0.640625 -1.40625 0.96875q-0.734375 0.3125 -1.59375 0.3125q-1.484375 0 -2.34375 -0.8125q-0.859375 -0.8125 -0.859375 -2.046875q0 -0.828125 0.390625 -1.46875q0.390625 -0.640625 1.09375 -0.96875q0.703125 -0.34375 2.03125 -0.609375q1.796875 -0.328125 2.484375 -0.625l0 -0.25q0 -0.75 -0.359375 -1.0625q-0.359375 -0.3125 -1.375 -0.3125q-0.6875 0 -1.078125 0.28125q-0.375 0.265625 -0.609375 0.9375zm3.421875 2.078125q-0.484375 0.15625 -1.5625 0.390625q-1.0625 0.21875 -1.390625 0.4375q-0.5 0.359375 -0.5 0.90625q0 0.53125 0.40625 0.9375q0.40625 0.390625 1.015625 0.390625q0.703125 0 1.328125 -0.46875q0.46875 -0.34375 0.609375 -0.84375q0.09375 -0.328125 0.09375 -1.25l0 -0.5zm13.844421 4.640625l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm7.036621 -9.671875l0 2.03125l-1.75 0l0 3.90625q0 1.1875 0.046875 1.390625q0.046875 0.1875 0.21875 0.3125q0.1875 0.125 0.4375 0.125q0.359375 0 1.03125 -0.25l0.21875 2.0q-0.890625 0.375 -2.015625 0.375q-0.703125 0 -1.265625 -0.234375q-0.546875 -0.234375 -0.8125 -0.59375q-0.25 -0.375 -0.34375 -1.0q-0.09375 -0.453125 -0.09375 -1.8125l0 -4.21875l-1.171875 0l0 -2.03125l1.171875 0l0 -1.921875l2.578125 -1.5l0 3.421875l1.75 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m809.80664 998.25146l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m669.8574 1016.3538l139.94922 0l0 1.6799927l-139.94922 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/third_party/wpa_supplicant/wpa_supplicant/?q%3Dwpa_supplicant&sa=D&source=editors&ust=1638577908238000&usg=AOvVaw2UhcCz4DmA_EaO4q2tEFM1" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m669.8574 997.22046l139.94922 0l0 22.400024l-139.94922 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m632.48425 918.68646l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l191.88428 0c1.4020386 0 2.746582 0.5569458 3.737915 1.5482788c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286194 5.286194l-191.88428 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m632.48425 918.68646l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l191.88428 0c1.4020386 0 2.746582 0.5569458 3.737915 1.5482788c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286194 5.286194l-191.88428 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path fill="#000000" d="m651.04364 935.46857l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0839844 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.9628906 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm4.1777344 0l-1.90625 -6.21875l1.09375 0l0.984375 3.59375l0.375 1.328125q0.03125 -0.09375 0.328125 -1.28125l0.984375 -3.640625l1.078125 0l0.9375 3.609375l0.3125 1.1875l0.359375 -1.203125l1.0625 -3.59375l1.03125 0l-1.953125 6.21875l-1.09375 0l-0.984375 -3.734375l-0.25 -1.046875l-1.25 4.78125l-1.109375 0zm11.197266 0l-1.046875 0l0 -6.71875q-0.390625 0.359375 -1.015625 0.734375q-0.609375 0.359375 -1.09375 0.53125l0 -1.015625q0.875 -0.421875 1.53125 -1.0q0.671875 -0.59375 0.953125 -1.15625l0.671875 0l0 8.625zm3.2988281 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm4.1777344 0l-1.90625 -6.21875l1.09375 0l0.984375 3.59375l0.375 1.328125q0.03125 -0.09375 0.328125 -1.28125l0.984375 -3.640625l1.078125 0l0.9375 3.609375l0.3125 1.1875l0.359375 -1.203125l1.0625 -3.59375l1.03125 0l-1.953125 6.21875l-1.09375 0l-0.984375 -3.734375l-0.25 -1.046875l-1.25 4.78125l-1.109375 0zm7.5253906 2.390625l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm9.783203 2.3125q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm1.7207031 5.515625l0 -0.765625l7.0 0l0 0.765625l-7.0 0zm7.236328 -4.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm10.5 1.859375l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.5957031 2.390625l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm5.720703 5.46875l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm5.689453 3.078125l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm2.6972656 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.7285156 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm6.0 1.515625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm8.970703 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm4.7089844 0.9375l-1.046875 0l0 -6.71875q-0.390625 0.359375 -1.015625 0.734375q-0.609375 0.359375 -1.09375 0.53125l0 -1.015625q0.875 -0.421875 1.53125 -1.0q0.671875 -0.59375 0.953125 -1.15625l0.671875 0l0 8.625zm3.2988281 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.3652344 0l0 -8.59375l1.125 0l0 8.59375l-1.125 0zm3.0058594 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm8.970703 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm5.2871094 -1.0625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm4.2617188 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm7.1464844 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm6.767578 0.84375l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm6.1875 0.28125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m920.18243 920.23895l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l200.60864 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.9914551 0.991333 1.5483398 2.3359375 1.5483398 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286255 5.286194l-200.60864 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m920.18243 920.23895l0 0c0 -2.9194946 2.3666992 -5.286194 5.286194 -5.286194l200.60864 0c1.4019775 0 2.746582 0.5569458 3.737915 1.5482788c0.9914551 0.991333 1.5483398 2.3359375 1.5483398 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286194 -5.286255 5.286194l-200.60864 0c-2.9194946 0 -5.286194 -2.3667603 -5.286194 -5.286194z" fill-rule="evenodd"/><path fill="#000000" d="m935.7954 933.9117q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm3.8085938 0.515625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm6.298828 3.21875l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.2871094 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0683594 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.261719 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm10.126953 1.703125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.908203 3.703125l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm10.220703 1.109375l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.455078 1.84375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm6.421875 1.859375l0 -8.59375l1.0625 0l0 4.90625l2.484375 -2.53125l1.375 0l-2.390625 2.296875l2.625 3.921875l-1.296875 0l-2.0625 -3.1875l-0.734375 0.71875l0 2.46875l-1.0625 0zm8.296875 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 5.5l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm6.017578 3.078125l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0zm3.1308594 0l0 -8.59375l1.71875 0l2.03125 6.078125q0.28125 0.859375 0.40625 1.28125q0.140625 -0.46875 0.453125 -1.375l2.0625 -5.984375l1.53125 0l0 8.59375l-1.09375 0l0 -7.1875l-2.5 7.1875l-1.03125 0l-2.484375 -7.3125l0 7.3125l-1.09375 0zm9.511719 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm10.017578 3.109375l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm10.220703 1.109375l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm10.089844 0l0 -8.59375l1.71875 0l2.03125 6.078125q0.28125 0.859375 0.40625 1.28125q0.140625 -0.46875 0.453125 -1.375l2.0625 -5.984375l1.53125 0l0 8.59375l-1.09375 0l0 -7.1875l-2.5 7.1875l-1.03125 0l-2.484375 -7.3125l0 7.3125l-1.09375 0zm13.964844 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.736328 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.5019531 3.640625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.251953 1.21875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm7.6835938 0l-1.046875 0l0 -6.71875q-0.390625 0.359375 -1.015625 0.734375q-0.609375 0.359375 -1.09375 0.53125l0 -1.015625q0.875 -0.421875 1.53125 -1.0q0.671875 -0.59375 0.953125 -1.15625l0.671875 0l0 8.625z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m940.31494 1026.2362l175.9685 0l0 37.57483l-175.9685 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m940.31494 1026.2362l175.9685 0l0 37.57483l-175.9685 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m996.16547 1036.2672l64.26752 0l0 21.45288l-64.26752 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m997.35297 1053.1562l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1917114 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6447754 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.891357 4.90625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.040771 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.891357 -6.5625l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448975 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1060.433 1036.2672l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m996.16547 1054.3695l64.26752 0l0 1.6800537l-64.26752 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://docs.google.com/drawings/d/1uGg3EKV0wzma3FBQm94c45M2xV0tmQcNdbtygUnOjlI/edit&sa=D&source=editors&ust=1638577908247000&usg=AOvVaw1gEjzvFhCE0y__YdgilinR" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m996.16547 1035.2362l64.26752 0l0 22.400024l-64.26752 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m1138.7454 1026.2362l152.25195 0l0 37.57483l-152.25195 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1138.7454 1026.2362l152.25195 0l0 37.57483l-152.25195 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1190.508 1036.2672l48.726685 0l0 21.45288l-48.726685 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1191.6956 1053.1562l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1916504 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448975 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm15.047485 8.609375l0 -4.734375q-0.375 0.546875 -1.0625 0.90625q-0.6875 0.34375 -1.46875 0.34375q-1.71875 0 -2.96875 -1.375q-1.234375 -1.375 -1.234375 -3.765625q0 -1.46875 0.5 -2.625q0.515625 -1.15625 1.46875 -1.75q0.96875 -0.59375 2.109375 -0.59375q1.796875 0 2.828125 1.515625l0 -1.296875l1.46875 0l0 13.375l-1.640625 0zm-5.046875 -8.5625q0 1.859375 0.78125 2.796875q0.78125 0.9375 1.875 0.9375q1.046875 0 1.796875 -0.890625q0.765625 -0.890625 0.765625 -2.703125q0 -1.9375 -0.796875 -2.90625q-0.796875 -0.96875 -1.875 -0.96875q-1.0625 0 -1.8125 0.90625q-0.734375 0.90625 -0.734375 2.828125zm9.266357 4.859375l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm15.540894 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1239.2347 1036.2672l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1190.508 1054.3695l48.726685 0l0 1.6800537l-48.726685 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://docs.google.com/drawings/d/1uGg3EKV0wzma3FBQm94c45M2xV0tmQcNdbtygUnOjlI/edit&sa=D&source=editors&ust=1638577908249000&usg=AOvVaw2jAXNQ6dTte6AmOn4yceh2" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1190.508 1035.2362l48.726685 0l0 22.400024l-48.726685 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1098.7843 229.11023l498.48828 0l0 37.5748l-498.48828 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1098.7843 229.11023l498.48828 0l0 37.5748l-498.48828 0z" fill-rule="evenodd"/><path fill="#000000" d="m1263.9747 246.86461l1.0625 -0.09375q0.078125 0.65625 0.359375 1.0625q0.28125 0.40625 0.859375 0.671875q0.59375 0.25 1.328125 0.25q0.640625 0 1.140625 -0.1875q0.5 -0.203125 0.734375 -0.53125q0.25 -0.34375 0.25 -0.734375q0 -0.40625 -0.234375 -0.703125q-0.234375 -0.3125 -0.765625 -0.515625q-0.359375 -0.140625 -1.546875 -0.421875q-1.171875 -0.28125 -1.640625 -0.53125q-0.625 -0.328125 -0.921875 -0.796875q-0.296875 -0.484375 -0.296875 -1.078125q0 -0.640625 0.359375 -1.203125q0.375 -0.578125 1.078125 -0.859375q0.71875 -0.296875 1.578125 -0.296875q0.953125 0 1.6875 0.3125q0.734375 0.296875 1.125 0.90625q0.390625 0.59375 0.421875 1.34375l-1.09375 0.078125q-0.09375 -0.8125 -0.609375 -1.21875q-0.5 -0.421875 -1.484375 -0.421875q-1.03125 0 -1.5 0.375q-0.46875 0.375 -0.46875 0.90625q0 0.46875 0.328125 0.765625q0.328125 0.296875 1.703125 0.609375q1.390625 0.3125 1.90625 0.546875q0.75 0.359375 1.109375 0.890625q0.359375 0.515625 0.359375 1.21875q0 0.6875 -0.390625 1.296875q-0.390625 0.59375 -1.125 0.9375q-0.734375 0.328125 -1.65625 0.328125q-1.171875 0 -1.96875 -0.328125q-0.78125 -0.34375 -1.234375 -1.03125q-0.4375 -0.6875 -0.453125 -1.546875zm12.503906 0.765625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm8.173828 2.765625l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm3.3339844 0l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6660156 0l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.470703 0.515625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm5.580078 1.359375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm14.662109 0.84375q-0.515625 0.578125 -1.140625 0.875q-0.609375 0.28125 -1.328125 0.28125q-1.3125 0 -2.09375 -0.890625q-0.625 -0.71875 -0.625 -1.625q0 -0.796875 0.515625 -1.4375q0.515625 -0.640625 1.53125 -1.125q-0.578125 -0.671875 -0.78125 -1.078125q-0.1875 -0.421875 -0.1875 -0.8125q0 -0.765625 0.609375 -1.328125q0.609375 -0.578125 1.53125 -0.578125q0.875 0 1.421875 0.546875q0.5625 0.53125 0.5625 1.28125q0 1.234375 -1.609375 2.09375l1.53125 1.96875q0.265625 -0.515625 0.40625 -1.203125l1.109375 0.234375q-0.28125 1.125 -0.765625 1.859375q0.59375 0.78125 1.34375 1.3125l-0.71875 0.84375q-0.640625 -0.421875 -1.3125 -1.21875zm-2.140625 -4.46875q0.6875 -0.40625 0.875 -0.703125q0.203125 -0.3125 0.203125 -0.6875q0 -0.4375 -0.28125 -0.71875q-0.265625 -0.28125 -0.6875 -0.28125q-0.421875 0 -0.71875 0.28125q-0.28125 0.28125 -0.28125 0.671875q0 0.203125 0.109375 0.421875q0.109375 0.21875 0.3125 0.46875l0.46875 0.546875zm1.484375 3.640625l-1.9375 -2.40625q-0.859375 0.515625 -1.15625 0.953125q-0.296875 0.4375 -0.296875 0.859375q0 0.53125 0.40625 1.09375q0.421875 0.5625 1.1875 0.5625q0.46875 0 0.96875 -0.296875q0.515625 -0.296875 0.828125 -0.765625zm13.353516 -1.171875l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.0097656 -0.09375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.923828 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0839844 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.4628906 0.515625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.080078 3.21875l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm2.5800781 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.074219 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm5.001953 2.1875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.2753906 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.986328 3.109375l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm11.6328125 0l-2.28125 -8.59375l1.171875 0l1.3125 5.640625q0.203125 0.875 0.359375 1.75q0.328125 -1.375 0.390625 -1.59375l1.625 -5.796875l1.375 0l1.234375 4.34375q0.453125 1.625 0.671875 3.046875q0.15625 -0.8125 0.421875 -1.875l1.34375 -5.515625l1.140625 0l-2.34375 8.59375l-1.109375 0l-1.796875 -6.546875q-0.234375 -0.8125 -0.28125 -1.0q-0.125 0.578125 -0.25 1.0l-1.8125 6.546875l-1.171875 0zm13.734375 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.845703 3.703125l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm11.486328 -5.4375l1.140625 0l0 4.96875q0 1.296875 -0.296875 2.0625q-0.296875 0.75 -1.0625 1.234375q-0.765625 0.46875 -2.0 0.46875q-1.203125 0 -1.984375 -0.40625q-0.765625 -0.421875 -1.09375 -1.203125q-0.328125 -0.796875 -0.328125 -2.15625l0 -4.96875l1.140625 0l0 4.953125q0 1.125 0.203125 1.65625q0.21875 0.53125 0.71875 0.828125q0.515625 0.28125 1.25 0.28125q1.25 0 1.78125 -0.5625q0.53125 -0.578125 0.53125 -2.203125l0 -4.953125zm3.2285156 8.59375l0 -8.59375l1.125 0l0 8.59375l-1.125 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m878.19977 230.4147l171.05511 0l0 37.5748l-171.05511 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m878.19977 230.4147l171.05511 0l0 37.5748l-171.05511 0z" fill-rule="evenodd"/><path fill="#000000" d="m923.26733 248.16907l1.0625 -0.09375q0.078125 0.65625 0.359375 1.0625q0.28125 0.40625 0.859375 0.671875q0.59375 0.25 1.328125 0.25q0.640625 0 1.140625 -0.1875q0.5 -0.203125 0.734375 -0.53125q0.25 -0.34375 0.25 -0.734375q0 -0.40625 -0.234375 -0.703125q-0.234375 -0.3125 -0.765625 -0.515625q-0.359375 -0.140625 -1.546875 -0.421875q-1.171875 -0.28125 -1.640625 -0.53125q-0.625 -0.328125 -0.921875 -0.796875q-0.296875 -0.484375 -0.296875 -1.078125q0 -0.640625 0.359375 -1.203125q0.375 -0.578125 1.078125 -0.859375q0.71875 -0.296875 1.578125 -0.296875q0.953125 0 1.6875 0.3125q0.734375 0.296875 1.125 0.90625q0.390625 0.59375 0.421875 1.34375l-1.09375 0.078125q-0.09375 -0.8125 -0.609375 -1.21875q-0.5 -0.421875 -1.484375 -0.421875q-1.03125 0 -1.5 0.375q-0.46875 0.375 -0.46875 0.90625q0 0.46875 0.328125 0.765625q0.328125 0.296875 1.703125 0.609375q1.390625 0.3125 1.90625 0.546875q0.75 0.359375 1.109375 0.890625q0.359375 0.515625 0.359375 1.21875q0 0.6875 -0.390625 1.296875q-0.390625 0.59375 -1.125 0.9375q-0.734375 0.328125 -1.65625 0.328125q-1.171875 0 -1.96875 -0.328125q-0.78125 -0.34375 -1.234375 -1.03125q-0.4375 -0.6875 -0.453125 -1.546875zm8.207031 5.15625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm5.625 -4.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm8.71875 0.921875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm5.2871094 -1.0625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 3.703125l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm15.425781 0l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm4.5566406 0l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm8.074219 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.6582031 5.515625l-0.125 -0.984375q0.34375 0.09375 0.609375 0.09375q0.34375 0 0.546875 -0.125q0.21875 -0.109375 0.359375 -0.3125q0.09375 -0.171875 0.328125 -0.796875q0.015625 -0.078125 0.09375 -0.25l-2.375 -6.234375l1.140625 0l1.296875 3.59375q0.25 0.6875 0.453125 1.453125q0.1875 -0.734375 0.4375 -1.421875l1.328125 -3.625l1.046875 0l-2.359375 6.328125q-0.390625 1.015625 -0.59375 1.40625q-0.28125 0.53125 -0.65625 0.765625q-0.359375 0.25 -0.859375 0.25q-0.296875 0 -0.671875 -0.140625zm15.146484 -10.984375l1.140625 0l0 4.96875q0 1.296875 -0.296875 2.0625q-0.296875 0.75 -1.0625 1.234375q-0.765625 0.46875 -2.0 0.46875q-1.203125 0 -1.984375 -0.40625q-0.765625 -0.421875 -1.09375 -1.203125q-0.328125 -0.796875 -0.328125 -2.15625l0 -4.96875l1.140625 0l0 4.953125q0 1.125 0.203125 1.65625q0.21875 0.53125 0.71875 0.828125q0.515625 0.28125 1.25 0.28125q1.25 0 1.78125 -0.5625q0.53125 -0.578125 0.53125 -2.203125l0 -4.953125zm3.2285156 8.59375l0 -8.59375l1.125 0l0 8.59375l-1.125 0z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m1234.0027 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l74.65588 0c1.4019775 0 2.746582 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5483398 2.3358765 1.5483398 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286255 5.286194l-74.65588 0l0 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1234.0027 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l74.65588 0c1.4019775 0 2.746582 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5483398 2.3358765 1.5483398 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286255 5.286194l-74.65588 0l0 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path fill="#000000" d="m1249.907 649.74884l0 -9.546875l1.265625 0l0 3.921875l4.953125 0l0 -3.921875l1.265625 0l0 9.546875l-1.265625 0l0 -4.5l-4.953125 0l0 4.5l-1.265625 0zm14.171997 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4541016 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0531006 2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm2.921753 -7.796875l0.296875 -0.921875q1.03125 0.375 1.5 0.640625q-0.125 -1.1875 -0.125 -1.625l0.9375 0q-0.015625 0.640625 -0.140625 1.609375q0.65625 -0.328125 1.53125 -0.625l0.296875 0.921875q-0.828125 0.28125 -1.625 0.375q0.40625 0.34375 1.125 1.21875l-0.78125 0.5625q-0.375 -0.515625 -0.890625 -1.40625q-0.484375 0.921875 -0.84375 1.40625l-0.765625 -0.5625q0.75 -0.921875 1.078125 -1.21875q-0.84375 -0.171875 -1.59375 -0.375z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m496.78195 230.74278l171.05515 0l0 37.574814l-171.05515 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m496.78195 230.74278l171.05515 0l0 37.574814l-171.05515 0z" fill-rule="evenodd"/><path fill="#000000" d="m534.2685 251.26279l0 -8.59375l5.796875 0l0 1.015625l-4.65625 0l0 2.65625l4.03125 0l0 1.015625l-4.03125 0l0 3.90625l-1.140625 0zm11.392578 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm10.126953 1.703125l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm9.908203 3.703125l0 -0.78125q-0.59375 0.921875 -1.734375 0.921875q-0.75 0 -1.375 -0.40625q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.59375l-0.984375 0zm-3.328125 -3.109375q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm6.939453 3.109375l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm9.783203 2.390625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm6.767578 0.84375l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.9375 2.28125l0 -8.59375l1.0625 0l0 4.90625l2.484375 -2.53125l1.375 0l-2.390625 2.296875l2.625 3.921875l-1.296875 0l-2.0625 -3.1875l-0.734375 0.71875l0 2.46875l-1.0625 0zm9.474609 0l0 -8.59375l3.8125 0q1.15625 0 1.75 0.234375q0.59375 0.234375 0.953125 0.828125q0.359375 0.578125 0.359375 1.28125q0 0.921875 -0.59375 1.546875q-0.59375 0.625 -1.828125 0.796875q0.453125 0.21875 0.6875 0.421875q0.5 0.453125 0.9375 1.140625l1.5 2.34375l-1.4375 0l-1.125 -1.78125q-0.5 -0.78125 -0.828125 -1.1875q-0.3125 -0.40625 -0.578125 -0.5625q-0.25 -0.171875 -0.515625 -0.25q-0.1875 -0.03125 -0.625 -0.03125l-1.328125 0l0 3.8125l-1.140625 0zm1.140625 -4.796875l2.453125 0q0.765625 0 1.203125 -0.15625q0.453125 -0.171875 0.671875 -0.515625q0.234375 -0.359375 0.234375 -0.78125q0 -0.609375 -0.453125 -1.0q-0.4375 -0.390625 -1.390625 -0.390625l-2.71875 0l0 2.84375zm11.634766 2.796875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.876953 6.09375l0 -8.609375l0.953125 0l0 0.796875q0.34375 -0.46875 0.765625 -0.703125q0.4375 -0.234375 1.046875 -0.234375q0.796875 0 1.40625 0.40625q0.609375 0.40625 0.90625 1.15625q0.3125 0.75 0.3125 1.640625q0 0.953125 -0.34375 1.71875q-0.328125 0.765625 -0.984375 1.171875q-0.65625 0.40625 -1.375 0.40625q-0.53125 0 -0.953125 -0.21875q-0.421875 -0.234375 -0.6875 -0.5625l0 3.03125l-1.046875 0zm0.953125 -5.46875q0 1.203125 0.484375 1.78125q0.484375 0.5625 1.171875 0.5625q0.703125 0 1.203125 -0.59375q0.5 -0.59375 0.5 -1.84375q0 -1.1875 -0.484375 -1.765625q-0.484375 -0.59375 -1.171875 -0.59375q-0.671875 0 -1.1875 0.625q-0.515625 0.625 -0.515625 1.828125zm5.330078 -0.03125q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.970703 3.109375l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm6.3085938 -0.9375l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6152344 -0.921875l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5z" fill-rule="nonzero"/><defs><linearGradient id="p.5" gradientUnits="userSpaceOnUse" gradientTransform="matrix(13.81608296015827 0.0 0.0 13.81608296015827 0.0 0.0)" spreadMethod="pad" x1="58.502680497066756" y1="22.681664627686473" x2="48.733326564729104" y2="12.912126659763194"><stop offset="0.0" stop-color="#3c78d8"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.5)" d="m557.11255 300.8466l0 0c0 -3.4587402 2.803894 -6.2626038 6.2626343 -6.2626038l219.85272 0c1.6609497 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342896 2.7673645 1.8342896 4.428314l0 25.049622c0 3.4587097 -2.803894 6.2625732 -6.2626343 6.2625732l-219.85272 0c-3.4587402 0 -6.2626343 -2.8038635 -6.2626343 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m557.11255 300.8466l0 0c0 -3.4587402 2.803894 -6.2626038 6.2626343 -6.2626038l219.85272 0c1.6609497 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8342896 2.7673645 1.8342896 4.428314l0 25.049622c0 3.4587097 -2.803894 6.2625732 -6.2626343 6.2625732l-219.85272 0c-3.4587402 0 -6.2626343 -2.8038635 -6.2626343 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m575.1465 306.15265l196.31012 0l0 15.32605l-196.31012 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m580.5371 315.68698l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0164795 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm2.421753 1.046875l-2.125 -6.90625l1.21875 0l1.09375 3.984375l0.421875 1.484375q0.015625 -0.109375 0.359375 -1.421875l1.09375 -4.046875l1.203125 0l1.03125 4.0l0.34375 1.328125l0.40625 -1.34375l1.171875 -3.984375l1.140625 0l-2.15625 6.90625l-1.21875 0l-1.09375 -4.140625l-0.265625 -1.171875l-1.40625 5.3125l-1.21875 0zm7.906372 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4696045 0l0 -9.546875l1.171875 0l0 5.453125l2.765625 -2.8125l1.515625 0l-2.640625 2.5625l2.90625 4.34375l-1.4375 0l-2.28125 -3.53125l-0.828125 0.796875l0 2.734375l-1.171875 0zm5.5703125 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.490601 -2.65625l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm11.037476 3.265625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm5.5392456 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.7406006 0l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374817 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664978 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0079346 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m771.4566 306.15265l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m575.1465 319.0849l196.31012 0l0 1.2000122l-196.31012 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/services/network_health/public/mojom/network_health.mojom;l%3D9?q%3Dnetwork_health.mojom%26sq%3D%26ss%3Dchromium&sa=D&source=editors&ust=1638577908260000&usg=AOvVaw28ybHi5HGyeCAUlmf__dTZ" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m575.1465 305.41824l196.31012 0l0 16.0l-196.31012 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1160.627 300.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1160.627 300.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1182.738 306.15396l188.15588 0l0 15.32605l-188.15588 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1188.1287 315.6883l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0166016 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm7.890503 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9610596 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5079346 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8656006 0l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.4923096 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm3.3758545 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm8.021851 -4.71875l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm11.8671875 -0.15625l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.671753 1.046875l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8812256 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm6.6781006 3.421875l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0080566 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1370.8939 306.15396l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1182.738 319.0862l188.15588 0l0 1.2000122l-188.15588 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/main:ash/services/cellular_setup/public/mojom/cellular_setup.mojom?q%3Dcellular_setup.mojom%26ss%3Dchromium&sa=D&source=editors&ust=1638577908265000&usg=AOvVaw0URa34zZn9Fxpr16lgI-Ar" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1182.738 305.41956l188.15588 0l0 16.0l-188.15588 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m687.49084 230.74278l171.05511 0l0 37.574814l-171.05511 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m687.49084 230.74278l171.05511 0l0 37.574814l-171.05511 0z" fill-rule="evenodd"/><path fill="#000000" d="m735.25964 251.26279l0 -8.59375l2.96875 0q1.0 0 1.53125 0.125q0.734375 0.171875 1.25 0.609375q0.6875 0.578125 1.015625 1.484375q0.34375 0.890625 0.34375 2.03125q0 0.984375 -0.234375 1.734375q-0.21875 0.75 -0.578125 1.25q-0.359375 0.5 -0.796875 0.78125q-0.421875 0.28125 -1.015625 0.4375q-0.59375 0.140625 -1.375 0.140625l-3.109375 0zm1.140625 -1.015625l1.828125 0q0.859375 0 1.34375 -0.15625q0.484375 -0.15625 0.765625 -0.453125q0.40625 -0.390625 0.625 -1.078125q0.234375 -0.6875 0.234375 -1.65625q0 -1.34375 -0.453125 -2.0625q-0.4375 -0.734375 -1.0625 -0.984375q-0.46875 -0.171875 -1.46875 -0.171875l-1.8125 0l0 6.5625zm7.4003906 -6.359375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.7285156 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.5019531 3.640625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm6.001953 3.21875l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm6.283203 -3.109375q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.564453 1.25l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm8.71875 0.921875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 -6.4375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm6.7285156 -2.28125l1.03125 0.140625q-0.171875 1.0625 -0.875 1.671875q-0.703125 0.609375 -1.71875 0.609375q-1.28125 0 -2.0625 -0.828125q-0.765625 -0.84375 -0.765625 -2.40625q0 -1.0 0.328125 -1.75q0.34375 -0.765625 1.015625 -1.140625q0.6875 -0.375 1.5 -0.375q1.0 0 1.640625 0.515625q0.65625 0.5 0.84375 1.453125l-1.03125 0.15625q-0.140625 -0.625 -0.515625 -0.9375q-0.375 -0.328125 -0.90625 -0.328125q-0.796875 0 -1.296875 0.578125q-0.5 0.5625 -0.5 1.796875q0 1.265625 0.484375 1.828125q0.484375 0.5625 1.25 0.5625q0.625 0 1.03125 -0.375q0.421875 -0.375 0.546875 -1.171875zm1.515625 0.421875l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm15.521484 -6.734375l1.140625 0l0 4.96875q0 1.296875 -0.296875 2.0625q-0.296875 0.75 -1.0625 1.234375q-0.765625 0.46875 -2.0 0.46875q-1.203125 0 -1.984375 -0.40625q-0.765625 -0.421875 -1.09375 -1.203125q-0.328125 -0.796875 -0.328125 -2.15625l0 -4.96875l1.140625 0l0 4.953125q0 1.125 0.203125 1.65625q0.21875 0.53125 0.71875 0.828125q0.515625 0.28125 1.25 0.28125q1.25 0 1.78125 -0.5625q0.53125 -0.578125 0.53125 -2.203125l0 -4.953125zm3.2285156 8.59375l0 -8.59375l1.125 0l0 8.59375l-1.125 0z" fill-rule="nonzero"/><path fill="#6d9eeb" d="m965.1916 363.38846l171.05511 0l0 93.25983l-171.05511 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m965.1916 363.38846l171.05511 0l0 93.25983l-171.05511 0z" fill-rule="evenodd"/><path fill="#000000" d="m1009.87933 383.73282l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.6171875 2.984375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015564 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.54681396 -0.296875 -0.90618896 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65618896 0.765625 1.578064 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.593689 0.84375q-0.6875 0.84375 -0.6875 2.4375zm10.695251 2.84375l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm5.8515625 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.375 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm12.453125 4.953125l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.453125 1.859375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm8.40625 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m1018.1567 406.74844l0 -11.453125l3.953125 0q1.328125 0 2.031189 0.15625q0.984375 0.234375 1.6875 0.828125q0.90625 0.765625 1.34375 1.953125q0.453125 1.1875 0.453125 2.71875q0 1.3125 -0.3125 2.328125q-0.296875 1.0 -0.78125 1.65625q-0.46875 0.65625 -1.03125 1.046875q-0.5625 0.375 -1.375 0.578125q-0.79681396 0.1875 -1.828064 0.1875l-4.140625 0zm1.515625 -1.359375l2.453125 0q1.125 0 1.765625 -0.203125q0.65618896 -0.21875 1.031189 -0.59375q0.546875 -0.546875 0.84375 -1.453125q0.296875 -0.90625 0.296875 -2.203125q0 -1.796875 -0.59375 -2.765625q-0.578125 -0.96875 -1.421875 -1.296875q-0.60931396 -0.234375 -1.968689 -0.234375l-2.40625 0l0 8.75zm15.539001 -1.3125l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 1.90625l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm5.65625 1.78125l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578125l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m1005.21136 425.74844l0 -11.453125l2.28125 0l2.71875 8.109375q0.375 1.125 0.546875 1.6875q0.1875 -0.625 0.609375 -1.828125l2.734375 -7.96875l2.046875 0l0 11.453125l-1.46875 0l0 -9.59375l-3.328125 9.59375l-1.359375 0l-3.3125 -9.75l0 9.75l-1.46875 0zm18.609375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.67181396 0.25 0.98431396 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21868896 -0.4375 -0.28118896 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015015 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.3359375 4.859375l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.6640625 1.625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm11.9609375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625z" fill-rule="nonzero"/><path fill="#dd7e6b" d="m604.1142 1278.9318l271.43304 0l0 101.03931l-271.43304 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m604.1142 1278.9318l271.43304 0l0 101.03931l-271.43304 0z" fill-rule="evenodd"/><path fill="#000000" d="m649.79584 1336.3715l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm15.077393 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.4417114 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm9.484375 0l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm14.7751465 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563232 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.020935 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292114 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.322083 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004211 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881714 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.8533325 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m9.328084 1118.9843l1805.9528 0l0 148.25195l-1805.9528 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m9.328084 1118.9843l1805.9528 0l0 148.25195l-1805.9528 0z" fill-rule="evenodd"/><path fill="#000000" d="m886.6997 1145.9043l0 -13.359375l1.78125 0l0 6.625l6.625 -6.625l2.390625 0l-5.59375 5.421875l5.84375 7.9375l-2.328125 0l-4.765625 -6.765625l-2.171875 2.140625l0 4.625l-1.78125 0zm18.943542 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2283325 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000671 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0z" fill-rule="nonzero"/><path fill="#f6b26b" d="m9.333333 618.1103l322.07874 0l0 295.27563l-322.07874 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m9.333333 618.1103l322.07874 0l0 295.27563l-322.07874 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m106.35317 628.42377l128.03906 0l0 27.597656l-128.03906 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m108.10317 650.1503l0 -17.1875l5.5625 0q3.171875 0 4.125 0.265625q1.484375 0.390625 2.46875 1.6875q1.0 1.28125 1.0 3.34375q0 1.578125 -0.578125 2.65625q-0.5625 1.078125 -1.453125 1.703125q-0.890625 0.609375 -1.796875 0.796875q-1.25 0.25 -3.59375 0.25l-2.265625 0l0 6.484375l-3.46875 0zm3.46875 -14.28125l0 4.875l1.890625 0q2.0625 0 2.75 -0.265625q0.6875 -0.265625 1.078125 -0.84375q0.390625 -0.578125 0.390625 -1.328125q0 -0.9375 -0.546875 -1.546875q-0.546875 -0.609375 -1.390625 -0.765625q-0.625 -0.125 -2.5 -0.125l-1.671875 0zm14.9765625 5.625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.6718674 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.0312424 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3124924 -0.4375 3.2031174 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.8906174 0 -1.3906174 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.4062424 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.3593674 0.28125 -1.7812424 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3124924 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm12.191406 -6.46875l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921875l0 4.390625l2.25 0zm13.1328125 3.6875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm5.7695312 -8.421875l0 6.328125q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm11.285156 4.734375l3.078125 0l0 1.828125q0.59375 -0.9375 1.609375 -1.515625q1.03125 -0.59375 2.265625 -0.59375q2.171875 0 3.671875 1.703125q1.515625 1.703125 1.515625 4.734375q0 3.125 -1.53125 4.859375q-1.515625 1.71875 -3.671875 1.71875q-1.03125 0 -1.875 -0.40625q-0.84375 -0.421875 -1.765625 -1.40625l0 6.265625l-3.296875 0l0 -17.1875zm3.265625 6.015625q0 2.09375 0.828125 3.109375q0.828125 1.0 2.03125 1.0q1.140625 0 1.90625 -0.921875q0.765625 -0.921875 0.765625 -3.015625q0 -1.96875 -0.796875 -2.90625q-0.78125 -0.953125 -1.9375 -0.953125q-1.203125 0 -2.0 0.9375q-0.796875 0.921875 -0.796875 2.75zm13.957031 -2.21875l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm17.800781 5.984375l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm10.550781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm5.9414062 7.296875l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m234.39223 628.42377l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m106.35317 651.7103l128.03906 0l0 2.1599731l-128.03906 0l0 -2.1599731z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/README.md&sa=D&source=editors&ust=1638577908280000&usg=AOvVaw0xtsTU7RS5l_IpLaBwIMGn" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m106.35317 627.1103l128.03906 0l0 28.799988l-128.03906 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#efefef" d="m21.837269 276.4672l225.48032 0l0 193.22833l-225.48032 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.837269 276.4672l225.48032 0l0 193.22833l-225.48032 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m100.55203 286.78064l68.05078 0l0 27.597656l-68.05078 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m117.78641 308.5072l-3.765625 0l-1.5 -3.90625l-6.875 0l-1.40625 3.90625l-3.6875 0l6.6875 -17.1875l3.671875 0l6.875 17.1875zm-6.375 -6.796875l-2.375 -6.375l-2.3125 6.375l4.6875 0zm11.347656 6.796875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm17.042969 -8.765625l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm6.2695312 6.296875l0 -4.46875l-4.5 0l0 -3.078125l4.5 0l0 -4.46875l3.0 0l0 4.46875l4.515625 0l0 3.078125l-4.515625 0l0 4.46875l-3.0 0zm14.015625 0l0 -4.46875l-4.5 0l0 -3.078125l4.5 0l0 -4.46875l3.0 0l0 4.46875l4.515625 0l0 3.078125l-4.515625 0l0 4.46875l-3.0 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m168.60281 286.78064l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m100.55203 310.0672l68.05078 0l0 2.1600037l-68.05078 0l0 -2.1600037z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/arc%2B%2B&sa=D&source=editors&ust=1638577908282000&usg=AOvVaw0QKpgc0Stl6OfekfPGHexe" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m100.55203 285.4672l68.05078 0l0 28.799988l-68.05078 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#efefef" d="m51.359577 317.66797l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m51.359577 317.66797l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m118.765755 327.9814l90.66796 0l0 27.597656l-90.66796 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m131.50012 343.39548l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5624924 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375 5.828125 -2.375q3.1562424 0 5.1249924 1.859375q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.3437424 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.3749924 0 2.3749924 -0.875q1.0 -0.890625 1.421875 -2.765625zm9.472656 6.3125l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm10.878906 2.671875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm20.222656 -8.90625l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921875l0 4.390625l2.25 0zm2.2734375 -1.6875l0 -3.046875l3.296875 0l0 3.046875l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm17.996094 0l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm3.3320312 -14.140625l0 -3.046875l3.296875 0l0 3.046875l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m209.43372 327.9814l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m118.765755 351.26797l90.66796 0l0 2.1600037l-90.66796 0l0 -2.1600037z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/crostini&sa=D&source=editors&ust=1638577908284000&usg=AOvVaw2I83KHoP3INVulvOCAyGG-" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m118.765755 326.66797l90.66796 0l0 28.800018l-90.66796 0l0 -28.800018z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m597.50134 1156.5826l309.57477 0l0 88.188965l-309.57477 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m597.50134 1156.5826l309.57477 0l0 88.188965l-309.57477 0z" fill-rule="evenodd"/><path fill="#000000" d="m706.8266 1183.5027l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm15.077454 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.4416504 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm15.59375 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266357 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323364 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.5720215 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#8e7cc3" d="m1024.3439 1197.4121l258.2047 0l0 54.141724l-258.2047 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1024.3439 1197.4121l258.2047 0l0 54.141724l-258.2047 0z" fill-rule="evenodd"/><path fill="#000000" d="m1084.0692 1226.7155l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.363525 1.578125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1447754 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm9.375 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm14.931519 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.56311 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm26.989746 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266357 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323975 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.12561 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.5721436 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#f6b26b" d="m71.01837 1128.9003l202.4567 0l0 54.141724l-202.4567 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m71.01837 1128.9003l202.4567 0l0 54.141724l-202.4567 0z" fill-rule="evenodd"/><path fill="#000000" d="m141.5635 1153.3911l0 -13.359375l5.921875 0q1.78125 0 2.703125 0.359375q0.9375 0.359375 1.484375 1.28125q0.5625 0.90625 0.5625 2.015625q0 1.40625 -0.921875 2.390625q-0.921875 0.96875 -2.84375 1.234375q0.703125 0.34375 1.078125 0.671875q0.765625 0.703125 1.453125 1.765625l2.328125 3.640625l-2.21875 0l-1.765625 -2.78125q-0.78125 -1.203125 -1.28125 -1.828125q-0.5 -0.640625 -0.90625 -0.890625q-0.390625 -0.265625 -0.796875 -0.359375q-0.296875 -0.078125 -0.984375 -0.078125l-2.046875 0l0 5.9375l-1.765625 0zm1.765625 -7.453125l3.796875 0q1.21875 0 1.890625 -0.25q0.6875 -0.265625 1.046875 -0.8125q0.359375 -0.546875 0.359375 -1.1875q0 -0.953125 -0.6875 -1.5625q-0.6875 -0.609375 -2.1875 -0.609375l-4.21875 0l0 4.421875zm10.863571 2.609375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625717 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.625717 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144821 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.063217 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#000000" d="m112.83266 1162.9874l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 3.1875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm10.6953125 2.84375l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm6.7890625 0.234375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm4.8984375 4.171875l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.5859375 4.21875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.2578125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.9453125 2.6875l3.328125 -11.859375l1.125 0l-3.3125 11.859375l-1.140625 0zm9.953125 -0.203125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.5703125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm4.1171875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5234375 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm6.6484375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1328.8635 88.38316l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1328.8635 88.38316l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path fill="#000000" d="m1368.1232 109.055664l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm10.484375 -0.46875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm7.1796875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm15.4296875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 -1.75l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0zm8.15625 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1450.1075 98.25879l42.671875 0l0 18.398438l-42.671875 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1451.1075 115.94629l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm7.5 -5.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm11.625 1.21875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1492.7794 98.25879l4.4453125 0l0 18.398438l-4.4453125 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1450.1075 113.783165l42.671875 0l0 1.4400024l-42.671875 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1399.4161 117.25879l61.351562 0l0 18.398438l-61.351562 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1400.1349 128.05566l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm16.6875 1.015625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm7.640625 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.265625 0.375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m1460.7677 117.25879l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m1399.4161 132.78316l61.351562 0l0 1.4400024l-61.351562 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/2196359393073&sa=D&source=editors&ust=1638577908298000&usg=AOvVaw1FPXhPS5m-Kwoz-RQElkN_" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1450.1075 97.38316l47.117188 0l0 19.199997l-47.117188 0l0 -19.199997z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/2196359393073&sa=D&source=editors&ust=1638577908299000&usg=AOvVaw3di9lJXxv75lDFQVgdiKED" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1399.4161 116.38316l61.351562 0l0 19.199997l-61.351562 0l0 -19.199997z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m103.63911 88.3832l202.4567 0l0 59.71653l-202.4567 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m103.63911 88.3832l202.4567 0l0 59.71653l-202.4567 0z" fill-rule="evenodd"/><path fill="#000000" d="m117.18386 112.7432l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.4062576 0l0 11.453125l-1.4062576 0zm8.992195 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m184.41043 98.25883l109.375 0l0 18.398438l-109.375 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m185.62918 112.7432l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm17.070312 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm12.6640625 0l0 -11.453125l1.515625 0l0 4.703125l5.953125 0l0 -4.703125l1.515625 0l0 11.453125l-1.515625 0l0 -5.40625l-5.953125 0l0 5.40625l-1.515625 0zm17.007812 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2421875 3.921875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm6.6484375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m293.78543 98.25883l4.4453125 0l0 18.398438l-4.4453125 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m184.41043 113.7832l109.375 0l0 1.4400024l-109.375 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m149.72293 117.25883l110.28906 0l0 18.398445l-110.28906 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m157.3323 130.38383q-0.703125 0.78125 -1.53125 1.171875q-0.8125 0.390625 -1.765625 0.390625q-1.75 0 -2.78125 -1.203125q-0.84375 -0.96875 -0.84375 -2.15625q0 -1.0625076 0.6875 -1.9218826q0.6875 -0.859375 2.046875 -1.5q-0.78125 -0.890625 -1.046875 -1.4375q-0.25 -0.5625 -0.25 -1.078125q0 -1.03125 0.8125 -1.796875q0.8125 -0.765625 2.03125 -0.765625q1.171875 0 1.921875 0.71875q0.75 0.71875 0.75 1.734375q0 1.625 -2.171875 2.78125l2.0625 2.625q0.34375 -0.6875 0.546875 -1.59375l1.453125 0.3125q-0.375 1.5000076 -1.015625 2.4687576q0.796875 1.046875 1.796875 1.75l-0.953125 1.125q-0.84375 -0.546875 -1.75 -1.625zm-2.859375 -5.9687576q0.90625 -0.53125 1.171875 -0.9375q0.28125 -0.40625 0.28125 -0.90625q0 -0.578125 -0.375 -0.953125q-0.375 -0.375 -0.921875 -0.375q-0.578125 0 -0.953125 0.375q-0.375 0.359375 -0.375 0.890625q0 0.265625 0.125 0.5625q0.140625 0.296875 0.421875 0.625l0.625 0.71875zm1.96875 4.8593826l-2.578125 -3.1875076q-1.140625 0.671875 -1.546875 1.265625q-0.390625 0.578125 -0.390625 1.1406326q0 0.703125 0.546875 1.453125q0.5625 0.75 1.578125 0.75q0.640625 0 1.3125 -0.390625q0.671875 -0.40625 1.078125 -1.03125zm17.804688 -1.5468826l1.515625 0.37500763q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375076 -0.609375 -3.0781326q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625076q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.1718826zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.5937576 -0.484375 2.5156326q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.2343826zm1.453125 0q0 1.5937576 0.6875 2.3906326q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375076q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.1562576l0 -8.296883l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.1093826l-1.40625 0l0 -5.0468826q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.5312576l-1.40625 0zm9.2265625 0l0 -7.2031326l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.2031326l-1.40625 0zm4.1171875 -9.843758l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm3.2890625 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.9687576q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.1718826q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.9843826q0 1.6250076 0.640625 2.3750076q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.3437576q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm13.4296875 4.2968826l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.1406326l1.40625 0l0 4.5937576q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.6250076l0 -4.4375l1.40625 0l0 8.296883l-1.25 0zm3.4453125 0l0 -8.296883l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.3437576l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.5156326 0.71875 -0.8125076q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.8750076q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.1406326q-0.765625 0.3125 -2.296875 0.5312576q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.5156326zm6.6640625 2.9062576l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.7656326l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.8437576q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578133l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm3.0234375 -4.1562576q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.5937576 -0.484375 2.5156326q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.2343826zm1.453125 0q0 1.5937576 0.6875 2.3906326q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375076q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.1562576l0 -8.296883l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.1093826l-1.40625 0l0 -5.0468826q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.5312576l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m260.012 117.25883l0 0l0 18.398445l0 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m149.72293 132.7832l110.28906 0l0 1.4400024l-110.28906 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1276489334661&sa=D&source=editors&ust=1638577908304000&usg=AOvVaw3CQEuqYuDzyQl981I5Lpea" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m184.41043 97.3832l113.82031 0l0 19.199997l-113.82031 0l0 -19.199997z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1276489334661&sa=D&source=editors&ust=1638577908304000&usg=AOvVaw3CQEuqYuDzyQl981I5Lpea" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m149.72293 116.3832l110.28906 0l0 19.200005l-110.28906 0l0 -19.200005z" fill-rule="nonzero"/></a><path fill="#8e7cc3" d="m577.72833 88.39895l202.45673 0l0 59.685036l-202.45673 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m577.72833 88.39895l202.45673 0l0 59.685036l-202.45673 0z" fill-rule="evenodd"/><path fill="#000000" d="m621.06213 112.75895l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m683.8434 98.274574l54.242188 0l0 18.398438l-54.242188 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m693.24963 108.743324l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.8828125 1.34375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8046875 4.953125l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5546875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm3.4296875 0l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m738.0856 98.274574l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m683.8434 113.79895l54.242188 0l0 1.4400024l-54.242188 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/2023123091425&sa=D&source=editors&ust=1638577908306000&usg=AOvVaw1B90wrwL6E-cNU_NeS7ZZt" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m683.8434 97.39895l54.242188 0l0 19.200005l-54.242188 0l0 -19.200005z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m814.77295 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m814.77295 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path fill="#000000" d="m867.01306 112.75772l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m934.2396 98.273346l31.984375 0l0 18.398438l-31.984375 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m937.474 112.75772l-3.03125 -11.453125l1.546875 0l1.75 7.5q0.28125 1.1875 0.484375 2.34375q0.4375 -1.828125 0.515625 -2.109375l2.171875 -7.734375l1.828125 0l1.640625 5.796875q0.625 2.15625 0.890625 4.046875q0.21875 -1.078125 0.578125 -2.484375l1.796875 -7.359375l1.515625 0l-3.140625 11.453125l-1.453125 0l-2.421875 -8.734375q-0.296875 -1.09375 -0.359375 -1.34375q-0.171875 0.796875 -0.328125 1.34375l-2.4375 8.734375l-1.546875 0zm12.9296875 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.8046875 0l0 -11.453125l7.734375 0l0 1.34375l-6.21875 0l0 3.546875l5.375 0l0 1.359375l-5.375 0l0 5.203125l-1.515625 0zm9.5234375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m966.224 98.273346l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m934.2396 113.79772l31.984375 0l0 1.4400024l-31.984375 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1289555489305&sa=D&source=editors&ust=1638577908311000&usg=AOvVaw2R2RLBoNRt8I4DHkmJ1RXI" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m934.2396 97.39772l31.984375 0l0 19.199997l-31.984375 0l0 -19.199997z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m340.68372 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m340.68372 88.39772l202.45673 0l0 59.685043l-202.45673 0z" fill-rule="evenodd"/><path fill="#000000" d="m368.90036 112.75772l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m436.12692 98.273346l80.03122 0l0 18.398438l-80.03122 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m437.34567 112.75772l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm17.070312 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm8.0 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.5546875 0l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.6328125 0.6875l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.9687195 0 1.4999695 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.2968445 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.4687195 0 2.4218445 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.1093445 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.9687195 0 1.6249695 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.6249695 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m516.15814 98.273346l0 0l0 18.398438l0 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m436.12692 113.79772l80.03122 0l0 1.4400024l-80.03122 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1312179520755&sa=D&source=editors&ust=1638577908313000&usg=AOvVaw2XNWv69vMsQ5ecM0WJA1bT" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m436.12692 97.39772l80.03122 0l0 19.199997l-80.03122 0l0 -19.199997z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m443.3176 1015.5171l128.40945 0l0 37.57483l-128.40945 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m443.3176 1015.5171l128.40945 0l0 37.57483l-128.40945 0z" fill-rule="evenodd"/><path fill="#000000" d="m472.3561 1036.3807q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297577 8.546875l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516357 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141327 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.063202 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 3.703125l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.891357 4.78125l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0z" fill-rule="nonzero"/><path fill="#6d9eeb" d="m340.91208 728.53687l0 0c0 -4.1400146 3.3561707 -7.496155 7.496216 -7.496155l63.117798 0c1.9881287 0 3.894806 0.7897339 5.3006287 2.1955566c1.4058228 1.4058228 2.1955872 3.3125 2.1955872 5.300598l0 29.984009c0 4.1400146 -3.3561707 7.496216 -7.496216 7.496216l-63.117798 0c-4.140045 0 -7.496216 -3.3562012 -7.496216 -7.496216z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m340.91208 728.53687l0 0c0 -4.1400146 3.3561707 -7.496155 7.496216 -7.496155l63.117798 0c1.9881287 0 3.894806 0.7897339 5.3006287 2.1955566c1.4058228 1.4058228 2.1955872 3.3125 2.1955872 5.300598l0 29.984009c0 4.1400146 -3.3561707 7.496216 -7.496216 7.496216l-63.117798 0c-4.140045 0 -7.496216 -3.3562012 -7.496216 -7.496216z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m357.6342 730.1856l44.666016 0l0 13.798828l-44.666016 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m358.68106 741.0489l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0527344 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm2.6972656 -7.375l0 -1.21875l1.0625 0l0 1.21875l-1.0625 0zm0 7.375l0 -6.21875l1.0625 0l0 6.21875l-1.0625 0zm2.6660156 0l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm10.246094 0l0 -5.40625l-0.9375 0l0 -0.8125l0.9375 0l0 -0.671875q0 -0.625 0.109375 -0.921875q0.15625 -0.421875 0.53125 -0.671875q0.390625 -0.25 1.078125 -0.25q0.453125 0 0.984375 0.109375l-0.15625 0.90625q-0.328125 -0.046875 -0.625 -0.046875q-0.484375 0 -0.6875 0.203125q-0.1875 0.203125 -0.1875 0.765625l0 0.578125l1.21875 0l0 0.8125l-1.21875 0l0 5.40625l-1.046875 0zm3.0527344 0l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm6.7597656 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.296875 -0.46875 0.78125 -0.734375q0.484375 -0.28125 1.109375 -0.28125q0.6875 0 1.125 0.28125q0.453125 0.28125 0.625 0.796875q0.75 -1.078125 1.921875 -1.078125q0.9375 0 1.421875 0.515625q0.5 0.5 0.5 1.578125l0 4.265625l-1.046875 0l0 -3.921875q0 -0.625 -0.109375 -0.90625q-0.09375 -0.28125 -0.359375 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.65625 0 -1.09375 0.4375q-0.421875 0.4375 -0.421875 1.40625l0 3.609375l-1.0625 0l0 -4.046875q0 -0.703125 -0.265625 -1.046875q-0.25 -0.359375 -0.828125 -0.359375q-0.453125 0 -0.828125 0.234375q-0.375 0.234375 -0.546875 0.6875q-0.171875 0.453125 -0.171875 1.296875l0 3.234375l-1.046875 0zm10.292969 0l0 -1.203125l1.203125 0l0 1.203125l-1.203125 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m402.3002 730.1856l0 0l0 13.798828l0 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m357.6342 741.82886l44.666016 0l0 1.0800171l-44.666016 0l0 -1.0800171z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m356.28653 744.1856l47.36133 0l0 13.798828l-47.36133 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m357.17715 755.0489l0 -8.59375l1.71875 0l2.03125 6.078125q0.28125 0.859375 0.40625 1.28125q0.140625 -0.46875 0.453125 -1.375l2.0625 -5.984375l1.53125 0l0 8.59375l-1.09375 0l0 -7.1875l-2.5 7.1875l-1.03125 0l-2.484375 -7.3125l0 7.3125l-1.09375 0zm13.964844 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.7050781 3.125l0 -6.21875l0.9375 0l0 0.875q0.6875 -1.015625 1.984375 -1.015625q0.5625 0 1.03125 0.203125q0.484375 0.203125 0.71875 0.53125q0.234375 0.328125 0.328125 0.765625q0.046875 0.296875 0.046875 1.03125l0 3.828125l-1.046875 0l0 -3.78125q0 -0.65625 -0.125 -0.96875q-0.125 -0.3125 -0.4375 -0.5q-0.3125 -0.203125 -0.734375 -0.203125q-0.671875 0 -1.171875 0.4375q-0.484375 0.421875 -0.484375 1.609375l0 3.40625l-1.046875 0zm10.736328 -0.765625q-0.59375 0.5 -1.140625 0.703125q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.5q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.75l-1.109375 0q-0.15625 -0.328125 -0.203125 -0.765625zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.5019531 3.640625l1.03125 0.15625q0.0625 0.46875 0.359375 0.6875q0.390625 0.296875 1.0625 0.296875q0.734375 0 1.125 -0.296875q0.40625 -0.296875 0.546875 -0.8125q0.09375 -0.328125 0.078125 -1.359375q-0.6875 0.8125 -1.71875 0.8125q-1.28125 0 -1.984375 -0.921875q-0.703125 -0.9375 -0.703125 -2.21875q0 -0.890625 0.3125 -1.640625q0.328125 -0.765625 0.9375 -1.171875q0.609375 -0.40625 1.4375 -0.40625q1.109375 0 1.828125 0.890625l0 -0.75l0.96875 0l0 5.375q0 1.453125 -0.296875 2.0625q-0.296875 0.609375 -0.9375 0.953125q-0.640625 0.359375 -1.578125 0.359375q-1.109375 0 -1.796875 -0.5q-0.6875 -0.5 -0.671875 -1.515625zm0.875 -3.734375q0 1.21875 0.484375 1.78125q0.484375 0.5625 1.21875 0.5625q0.734375 0 1.21875 -0.5625q0.5 -0.5625 0.5 -1.75q0 -1.140625 -0.515625 -1.71875q-0.5 -0.578125 -1.21875 -0.578125q-0.703125 0 -1.203125 0.578125q-0.484375 0.5625 -0.484375 1.6875zm10.251953 1.21875l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m403.64786 744.1856l0 0l0 13.798828l0 0l0 -13.798828z" fill-rule="nonzero"/><path fill="#000099" d="m356.28653 755.82886l47.36133 0l0 1.0800171l-47.36133 0l0 -1.0800171z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/doc/manager-api.txt?q%3Dmanager-api.txt%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908318000&usg=AOvVaw3ha3kAeFKoB6MsRUbQVgoe" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m357.6342 729.5289l44.666016 0l0 14.400024l-44.666016 0l0 -14.400024z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/doc/manager-api.txt?q%3Dmanager-api.txt%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908318000&usg=AOvVaw3ha3kAeFKoB6MsRUbQVgoe" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m356.28653 743.5289l47.36133 0l0 14.400024l-47.36133 0l0 -14.400024z" fill-rule="nonzero"/></a><path fill="#000000" fill-opacity="0.0" d="m0.0026238845 -0.0131233595l1931.8425 0l0 70.89764l-1931.8425 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m0.0026238845 -0.0131233595l1931.8425 0l0 70.89764l-1931.8425 0z" fill-rule="evenodd"/><path fill="#000000" d="m627.89264 25.714378l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5625 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375001 5.828125 -2.375001q3.15625 0 5.125 1.859376q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.34375 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.375 0 2.375 -0.875q1.0 -0.890625 1.421875 -2.765625zm9.597656 -10.875001l0 6.328126q1.59375 -1.875 3.8125 -1.875q1.140625 0 2.046875 0.421875q0.921875 0.421875 1.375 1.078125q0.46875 0.65625 0.640625 1.453125q0.171875 0.796875 0.171875 2.484375l0 7.296875l-3.296875 0l0 -6.578125q0 -1.953125 -0.1875 -2.484375q-0.1875 -0.53125 -0.671875 -0.828125q-0.46875 -0.3125 -1.171875 -0.3125q-0.828125 0 -1.46875 0.40625q-0.640625 0.390625 -0.953125 1.1875q-0.296875 0.796875 -0.296875 2.375l0 6.234375l-3.28125 0l0 -17.1875l3.28125 0zm14.535156 17.1875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm11.800781 -6.234375l3.03125 0l0 1.703125q1.625 -1.984375 3.875 -1.984375q1.203125 0 2.078125 0.5q0.875 0.484375 1.4375 1.484375q0.828125 -1.0 1.765625 -1.484375q0.953125 -0.5 2.03125 -0.5q1.375 0 2.3125 0.5625q0.953125 0.5625 1.421875 1.640625q0.34375 0.796875 0.34375 2.578125l0 7.953125l-3.296875 0l0 -7.109375q0 -1.859375 -0.328125 -2.390625q-0.46875 -0.703125 -1.40625 -0.703125q-0.703125 0 -1.3125 0.421875q-0.609375 0.421875 -0.875 1.234375q-0.265625 0.8125 -0.265625 2.5625l0 5.984375l-3.296875 0l0 -6.828125q0 -1.8125 -0.171875 -2.328125q-0.171875 -0.53125 -0.546875 -0.78125q-0.375 -0.265625 -1.0 -0.265625q-0.765625 0 -1.375 0.40625q-0.609375 0.40625 -0.875 1.1875q-0.265625 0.765625 -0.265625 2.5625l0 6.046875l-3.28125 0l0 -12.453125zm28.792969 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm11.9375 -1.1875q0 -2.625 0.78125 -4.40625q0.59375 -1.3125 1.59375 -2.359375q1.015625 -1.046876 2.234375 -1.546876q1.59375 -0.671875 3.703125 -0.671875q3.796875 0 6.0625 2.359376q2.28125 2.34375 2.28125 6.546875q0 4.15625 -2.265625 6.515625q-2.25 2.34375 -6.03125 2.34375q-3.84375 0 -6.109375 -2.34375q-2.25 -2.34375 -2.25 -6.4375zm3.578125 -0.125q0 2.921875 1.34375 4.4375q1.34375 1.5 3.421875 1.5q2.078125 0 3.40625 -1.484375q1.328125 -1.5 1.328125 -4.5q0 -2.953125 -1.296875 -4.40625q-1.296875 -1.453125 -3.4375 -1.453125q-2.140625 0 -3.453125 1.484375q-1.3125 1.46875 -1.3125 4.421875zm14.917969 3.015625l3.375 -0.328125q0.296875 1.703125 1.21875 2.5q0.9375 0.796875 2.53125 0.796875q1.671875 0 2.515625 -0.703125q0.859375 -0.71875 0.859375 -1.671875q0 -0.609375 -0.359375 -1.03125q-0.359375 -0.421875 -1.25 -0.75q-0.609375 -0.203125 -2.78125 -0.75q-2.78125 -0.6875 -3.90625 -1.6875q-1.59375 -1.421875 -1.59375 -3.46875q0 -1.3125 0.75 -2.453125q0.75 -1.140626 2.140625 -1.734376q1.40625 -0.59375 3.390625 -0.59375q3.234375 0 4.859375 1.421875q1.640625 1.406251 1.71875 3.781251l-3.46875 0.140625q-0.21875 -1.3125 -0.953125 -1.890625q-0.734375 -0.59375 -2.203125 -0.59375q-1.5 0 -2.359375 0.625q-0.546875 0.40625 -0.546875 1.0625q0 0.609375 0.515625 1.046875q0.65625 0.546875 3.1875 1.15625q2.53125 0.59375 3.734375 1.234375q1.21875 0.640625 1.90625 1.75q0.6875 1.09375 0.6875 2.734375q0 1.46875 -0.828125 2.765625q-0.8125 1.28125 -2.3125 1.921875q-1.5 0.625 -3.75 0.625q-3.25 0 -5.0 -1.5q-1.75 -1.515625 -2.078125 -4.40625zm34.535156 -0.71875l3.375 1.0625q-0.78125 2.8125 -2.578125 4.1875q-1.796875 1.359375 -4.5625 1.359375q-3.421875 0 -5.625 -2.34375q-2.203125 -2.34375 -2.203125 -6.390625q0 -4.296875 2.203125 -6.65625q2.21875 -2.375001 5.828125 -2.375001q3.15625 0 5.125 1.859376q1.171875 1.09375 1.765625 3.15625l-3.4375 0.828125q-0.3125 -1.34375 -1.28125 -2.109375q-0.953125 -0.78125 -2.34375 -0.78125q-1.90625 0 -3.09375 1.375q-1.1875 1.375 -1.1875 4.4375q0 3.265625 1.171875 4.65625q1.171875 1.375 3.046875 1.375q1.375 0 2.375 -0.875q1.0 -0.890625 1.421875 -2.765625zm5.5664062 -0.09375q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm23.363281 6.21875l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm14.660156 0l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm10.550781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm16.800781 -1.46875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm8.207031 -3.6875l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm2.2734375 -1.6875l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm10.089844 0l-5.015625 -12.453125l3.46875 0l2.34375 6.359375l0.671875 2.125q0.265625 -0.8125 0.34375 -1.078125q0.15625 -0.515625 0.34375 -1.046875l2.375 -6.359375l3.390625 0l-4.953125 12.453125l-2.96875 0zm9.925781 -14.140625l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm12.386719 -12.453125l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm0.7265625 0l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm21.6875 12.453125l0 -17.046875l3.46875 0l0 14.156251l8.625 0l0 2.890625l-12.09375 0zm17.003906 -8.65625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm4.9257812 -6.46875l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm22.113281 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm9.097656 7.296875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.0273438 -3.546875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm26.640625 8.59375l-2.265625 0q-1.796875 -2.703125 -2.734375 -5.625q-0.9375 -2.921875 -0.9375 -5.640625q0 -3.390625 1.171875 -6.421875q1.0 -2.625 2.546875 -4.828126l2.25 0q-1.609375 3.546876 -2.21875 6.046876q-0.59375 2.484375 -0.59375 5.265625q0 1.921875 0.359375 3.9375q0.359375 2.015625 0.984375 3.84375q0.40625 1.1875 1.4375 3.421875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m996.59186 10.300315l312.1054 0l0 27.597656l-312.1054 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m998.01373 32.855003l3.765625 0.453125q0.09375 0.65625 0.421875 0.90625q0.46875 0.34375 1.484375 0.34375q1.28125 0 1.9375 -0.390625q0.421875 -0.25 0.65625 -0.828125q0.140625 -0.40625 0.140625 -1.515625l0 -1.8125q-1.46875 2.015625 -3.71875 2.015625q-2.515625 0 -3.96875 -2.125q-1.15625 -1.671875 -1.15625 -4.171875q0 -3.125 1.5 -4.78125q1.515625 -1.65625 3.75 -1.65625q2.3125 0 3.8125 2.03125l0 -1.75l3.078125 0l0 11.171875q0 2.203125 -0.359375 3.296875q-0.359375 1.09375 -1.015625 1.703125q-0.65625 0.625 -1.765625 0.96875q-1.09375 0.359375 -2.765625 0.359375q-3.15625 0 -4.484375 -1.078125q-1.328125 -1.078125 -1.328125 -2.75q0 -0.15625 0.015625 -0.390625zm2.9375 -7.3125q0 1.984375 0.765625 2.90625q0.765625 0.921875 1.890625 0.921875q1.21875 0 2.046875 -0.9375q0.828125 -0.953125 0.828125 -2.8125q0 -1.921875 -0.796875 -2.859375q-0.796875 -0.9375 -2.015625 -0.9375q-1.1875 0 -1.953125 0.921875q-0.765625 0.90625 -0.765625 2.796875zm11.269531 0.078125q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.812439 1.828125 1.812439 4.625q0 2.828125 -1.828064 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm10.285095 6.515625l4.25 -17.765625l2.46875 0l-4.296875 17.765625l-2.421875 0zm19.277344 -9.0625l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm5.6445312 8.765625l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.4335938 -6.40625q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm10.878906 2.671875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875zm14.144531 -1.03125l0 -3.296875l6.46875 0l0 3.296875l-6.46875 0zm19.210938 -4.1875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm1.7382812 2.359375q0 -1.640625 0.796875 -3.171875q0.8125 -1.53125 2.296875 -2.34375q1.484375 -0.8125 3.3125 -0.8125q2.828125 0 4.625 1.84375q1.8125 1.828125 1.8125 4.625q0 2.828125 -1.828125 4.6875q-1.828125 1.859375 -4.59375 1.859375q-1.703125 0 -3.265625 -0.765625q-1.546875 -0.78125 -2.359375 -2.265625q-0.796875 -1.5 -0.796875 -3.65625zm3.375 0.1875q0 1.84375 0.875 2.828125q0.875 0.984375 2.171875 0.984375q1.28125 0 2.15625 -0.984375q0.875 -0.984375 0.875 -2.859375q0 -1.828125 -0.875 -2.8125q-0.875 -0.984375 -2.15625 -0.984375q-1.296875 0 -2.171875 0.984375q-0.875 0.984375 -0.875 2.84375zm23.363281 6.21875l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm14.660156 0l-3.296875 0l0 -6.359375q0 -2.015625 -0.21875 -2.59375q-0.203125 -0.59375 -0.6875 -0.921875q-0.46875 -0.328125 -1.125 -0.328125q-0.859375 0 -1.546875 0.46875q-0.671875 0.46875 -0.921875 1.25q-0.25 0.765625 -0.25 2.84375l0 5.640625l-3.296875 0l0 -12.453125l3.0625 0l0 1.828125q1.625 -2.109375 4.09375 -2.109375q1.09375 0 1.984375 0.40625q0.90625 0.390625 1.375 1.0q0.46875 0.609375 0.640625 1.390625q0.1875 0.765625 0.1875 2.203125l0 7.734375zm10.550781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm16.800781 -1.46875l-3.25 0.578125q-0.15625 -0.96875 -0.75 -1.453125q-0.578125 -0.5 -1.5 -0.5q-1.234375 0 -1.96875 0.859375q-0.71875 0.84375 -0.71875 2.828125q0 2.21875 0.734375 3.140625q0.75 0.90625 2.0 0.90625q0.9375 0 1.53125 -0.53125q0.609375 -0.53125 0.84375 -1.828125l3.234375 0.546875q-0.5 2.21875 -1.9375 3.359375q-1.421875 1.140625 -3.828125 1.140625q-2.71875 0 -4.34375 -1.71875q-1.625 -1.734375 -1.625 -4.78125q0 -3.078125 1.625 -4.796875q1.625 -1.71875 4.40625 -1.71875q2.28125 0 3.609375 0.984375q1.34375 0.984375 1.9375 2.984375zm8.207031 -3.6875l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm2.2734375 -1.6875l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm10.089844 0l-5.015625 -12.453125l3.46875 0l2.34375 6.359375l0.671875 2.125q0.265625 -0.8125 0.34375 -1.078125q0.15625 -0.515625 0.34375 -1.046875l2.375 -6.359375l3.390625 0l-4.953125 12.453125l-2.96875 0zm9.925781 -14.140625l0 -3.046876l3.296875 0l0 3.046876l-3.296875 0zm0 14.140625l0 -12.453125l3.296875 0l0 12.453125l-3.296875 0zm12.386719 -12.453125l0 2.625l-2.25 0l0 5.015625q0 1.53125 0.0625 1.78125q0.0625 0.25 0.28125 0.421875q0.234375 0.15625 0.5625 0.15625q0.453125 0 1.328125 -0.3125l0.28125 2.546875q-1.15625 0.5 -2.609375 0.5q-0.890625 0 -1.609375 -0.296875q-0.703125 -0.296875 -1.046875 -0.765625q-0.328125 -0.484375 -0.453125 -1.296875q-0.109375 -0.578125 -0.109375 -2.3125l0 -5.4375l-1.515625 0l0 -2.625l1.515625 0l0 -2.46875l3.3125 -1.921876l0 4.390626l2.25 0zm0.7265625 0l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm14.535156 7.875l0 -3.296875l6.46875 0l0 3.296875l-6.46875 0zm8.3515625 4.578125l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm9.136719 -8.65625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm4.9257812 -6.46875l3.5 0l2.96875 8.84375l2.90625 -8.84375l3.421875 0l-4.40625 11.984375l-0.78125 2.171875q-0.4375 1.09375 -0.828125 1.65625q-0.390625 0.578125 -0.90625 0.9375q-0.5 0.359375 -1.25 0.546875q-0.734375 0.203125 -1.671875 0.203125q-0.953125 0 -1.875 -0.1875l-0.28125 -2.578125q0.765625 0.140625 1.390625 0.140625q1.140625 0 1.6875 -0.671875q0.5625 -0.671875 0.859375 -1.71875l-4.734375 -12.484375zm22.113281 8.484375l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm9.097656 7.296875l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm5.0273438 -3.546875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875z" fill-rule="nonzero"/><path fill="#000000" d="m1309.5098 37.073753q0.96875 -2.078125 1.359375 -3.203125q0.40625 -1.109375 0.75 -2.5625q0.34375 -1.453125 0.5 -2.75q0.171875 -1.3125 0.171875 -2.6875q0 -2.78125 -0.609375 -5.265625q-0.59375 -2.5 -2.203125 -6.046876l2.25 0q1.765625 2.515626 2.734375 5.343751q0.984375 2.8125 0.984375 5.71875q0 2.453125 -0.765625 5.25q-0.890625 3.15625 -2.90625 6.203125l-2.265625 0z" fill-rule="nonzero"/><path fill="#000099" d="m996.59186 33.586876l312.1054 0l0 2.1599998l-312.1054 0l0 -2.1599998z" fill-rule="nonzero"/><path fill="#000000" d="m118.89459 52.65188q0 -4.265625 2.296875 -6.6875q2.296875 -2.421875 5.9375 -2.421875q2.375 0 4.28125 1.140625q1.921875 1.125 2.921875 3.171875q1.0 2.03125 1.0 4.609375q0 2.609375 -1.0625 4.671875q-1.046875 2.0625 -2.984375 3.125q-1.9375 1.0625 -4.171875 1.0625q-2.421875 0 -4.34375 -1.171875q-1.90625 -1.171875 -2.890625 -3.203125q-0.984375 -2.03125 -0.984375 -4.296875zm2.34375 0.046875q0 3.09375 1.671875 4.890625q1.671875 1.78125 4.1875 1.78125q2.578125 0 4.234375 -1.796875q1.65625 -1.8125 1.65625 -5.125q0 -2.09375 -0.71875 -3.65625q-0.703125 -1.578125 -2.078125 -2.4375q-1.359375 -0.859375 -3.046875 -0.859375q-2.421875 0 -4.171875 1.65625q-1.734375 1.65625 -1.734375 5.546875zm24.902344 8.328125l0 -1.828125q-1.453125 2.109375 -3.9375 2.109375q-1.109375 0 -2.0625 -0.421875q-0.953125 -0.421875 -1.421875 -1.0625q-0.453125 -0.640625 -0.640625 -1.5625q-0.140625 -0.625 -0.140625 -1.96875l0 -7.71875l2.109375 0l0 6.90625q0 1.65625 0.140625 2.234375q0.1875 0.828125 0.828125 1.3125q0.65625 0.46875 1.609375 0.46875q0.9375 0 1.765625 -0.484375q0.84375 -0.5 1.1875 -1.328125q0.34375 -0.84375 0.34375 -2.4375l0 -6.671875l2.109375 0l0 12.453125l-1.890625 0zm9.800781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm2.0117188 1.890625l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm21.878906 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm17.640625 1.203125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm12.472656 6.21875l0 -10.8125l-1.875 0l0 -1.640625l1.875 0l0 -1.3125q0 -1.265625 0.21875 -1.875q0.296875 -0.8125 1.0625 -1.3125q0.78125 -0.515625 2.15625 -0.515625q0.890625 0 1.96875 0.203125l-0.3125 1.84375q-0.65625 -0.125 -1.25 -0.125q-0.953125 0 -1.359375 0.421875q-0.390625 0.40625 -0.390625 1.53125l0 1.140625l2.421875 0l0 1.640625l-2.421875 0l0 10.8125l-2.09375 0zm12.8203125 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm21.878906 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm16.363281 5.53125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm4.3554688 1.890625l-3.796875 -12.453125l2.171875 0l1.984375 7.1875l0.734375 2.671875q0.046875 -0.203125 0.640625 -2.5625l1.984375 -7.296875l2.171875 0l1.859375 7.21875l0.625 2.390625l0.71875 -2.40625l2.125 -7.203125l2.046875 0l-3.890625 12.453125l-2.1875 0l-1.984375 -7.453125l-0.46875 -2.125l-2.53125 9.578125l-2.203125 0zm14.253906 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.941406 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm8.0234375 0l0 -17.1875l2.109375 0l0 9.796875l5.0 -5.0625l2.71875 0l-4.75 4.625l5.234375 7.828125l-2.59375 0l-4.125 -6.359375l-1.484375 1.421875l0 4.9375l-2.109375 0zm12.0 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.972656 1.03125l2.046875 0.3125q0.125 0.9375 0.71875 1.375q0.78125 0.59375 2.140625 0.59375q1.46875 0 2.265625 -0.59375q0.796875 -0.578125 1.078125 -1.640625q0.15625 -0.640625 0.140625 -2.703125q-1.375 1.625 -3.4375 1.625q-2.5625 0 -3.96875 -1.84375q-1.40625 -1.859375 -1.40625 -4.453125q0 -1.78125 0.640625 -3.28125q0.640625 -1.515625 1.859375 -2.328125q1.234375 -0.828125 2.890625 -0.828125q2.203125 0 3.625 1.78125l0 -1.5l1.953125 0l0 10.765625q0 2.90625 -0.59375 4.109375q-0.59375 1.21875 -1.875 1.921875q-1.28125 0.703125 -3.15625 0.703125q-2.234375 0 -3.609375 -1.0q-1.359375 -1.0 -1.3125 -3.015625zm1.734375 -7.484375q0 2.453125 0.96875 3.578125q0.984375 1.125 2.453125 1.125q1.453125 0 2.4375 -1.109375q0.984375 -1.125 0.984375 -3.515625q0 -2.28125 -1.015625 -3.4375q-1.015625 -1.171875 -2.453125 -1.171875q-1.40625 0 -2.390625 1.140625q-0.984375 1.140625 -0.984375 3.390625zm18.609375 6.453125l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm13.503906 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3007812 11.046875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm20.625 -8.8125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm11.738281 7.421875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.1640625 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm18.730469 -2.5q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm32.546875 -6.03125l2.28125 0.578125q-0.71875 2.796875 -2.578125 4.28125q-1.859375 1.46875 -4.546875 1.46875q-2.765625 0 -4.515625 -1.125q-1.734375 -1.140625 -2.640625 -3.28125q-0.90625 -2.15625 -0.90625 -4.609375q0 -2.6875 1.015625 -4.6875q1.03125 -2.0 2.921875 -3.03125q1.890625 -1.03125 4.171875 -1.03125q2.578125 0 4.328125 1.3125q1.765625 1.3125 2.453125 3.6875l-2.234375 0.53125q-0.609375 -1.875 -1.75 -2.734375q-1.125 -0.859375 -2.84375 -0.859375q-1.984375 0 -3.3125 0.953125q-1.328125 0.953125 -1.875 2.546875q-0.53125 1.59375 -0.53125 3.296875q0 2.1875 0.625 3.828125q0.640625 1.640625 1.984375 2.453125q1.359375 0.796875 2.921875 0.796875q1.921875 0 3.234375 -1.09375q1.328125 -1.109375 1.796875 -3.28125zm4.8007812 6.03125l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm13.332031 0l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.2265625 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm28.523438 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm18.0 -0.953125q0 -4.265625 2.296875 -6.6875q2.296875 -2.421875 5.9375 -2.421875q2.375 0 4.28125 1.140625q1.921875 1.125 2.921875 3.171875q1.0 2.03125 1.0 4.609375q0 2.609375 -1.0625 4.671875q-1.046875 2.0625 -2.984375 3.125q-1.9375 1.0625 -4.171875 1.0625q-2.421875 0 -4.34375 -1.171875q-1.90625 -1.171875 -2.890625 -3.203125q-0.984375 -2.03125 -0.984375 -4.296875zm2.34375 0.046875q0 3.09375 1.671875 4.890625q1.671875 1.78125 4.1875 1.78125q2.578125 0 4.234375 -1.796875q1.65625 -1.8125 1.65625 -5.125q0 -2.09375 -0.71875 -3.65625q-0.703125 -1.578125 -2.078125 -2.4375q-1.359375 -0.859375 -3.046875 -0.859375q-2.421875 0 -4.171875 1.65625q-1.734375 1.65625 -1.734375 5.546875zm16.246094 2.8125l2.140625 -0.1875q0.15625 1.28125 0.703125 2.109375q0.5625 0.828125 1.734375 1.34375q1.171875 0.5 2.640625 0.5q1.296875 0 2.296875 -0.375q1.0 -0.390625 1.484375 -1.0625q0.484375 -0.6875 0.484375 -1.484375q0 -0.796875 -0.46875 -1.40625q-0.46875 -0.609375 -1.546875 -1.015625q-0.6875 -0.265625 -3.0625 -0.828125q-2.359375 -0.578125 -3.3125 -1.078125q-1.234375 -0.640625 -1.84375 -1.59375q-0.59375 -0.96875 -0.59375 -2.140625q0 -1.3125 0.734375 -2.4375q0.75 -1.125 2.15625 -1.703125q1.421875 -0.59375 3.15625 -0.59375q1.90625 0 3.359375 0.609375q1.46875 0.609375 2.25 1.8125q0.796875 1.1875 0.84375 2.703125l-2.171875 0.171875q-0.171875 -1.640625 -1.1875 -2.46875q-1.015625 -0.828125 -3.0 -0.828125q-2.0625 0 -3.015625 0.765625q-0.9375 0.75 -0.9375 1.8125q0 0.921875 0.671875 1.515625q0.65625 0.609375 3.421875 1.234375q2.78125 0.625 3.8125 1.09375q1.5 0.6875 2.203125 1.75q0.71875 1.0625 0.71875 2.4375q0 1.375 -0.78125 2.59375q-0.78125 1.203125 -2.25 1.890625q-1.46875 0.671875 -3.3125 0.671875q-2.328125 0 -3.90625 -0.671875q-1.578125 -0.6875 -2.484375 -2.046875q-0.890625 -1.375 -0.9375 -3.09375zm17.070312 5.515625l0 -2.40625l2.390625 0l0 2.40625q0 1.328125 -0.46875 2.140625q-0.46875 0.8125 -1.484375 1.265625l-0.578125 -0.90625q0.65625 -0.296875 0.96875 -0.875q0.328125 -0.5625 0.359375 -1.625l-1.1875 0zm20.898438 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.09375 -1.65625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.910156 6.21875l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm4.5976562 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.941406 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm22.800781 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.09375 -1.65625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm20.035156 6.21875l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm20.472656 2.203125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm19.832031 7.421875l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm20.5625 6.21875l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.332031 11.109375l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm26.886719 -6.328125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3945312 11.015625l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.425781 10.921875l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.410156 6.15625l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.2265625 -6.21875q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm10.550781 6.21875l4.546875 -6.46875l-4.203125 -5.984375l2.640625 0l1.90625 2.921875q0.546875 0.828125 0.875 1.390625q0.515625 -0.765625 0.9375 -1.359375l2.109375 -2.953125l2.515625 0l-4.296875 5.859375l4.625 6.59375l-2.59375 0l-2.546875 -3.875l-0.6875 -1.03125l-3.265625 4.90625l-2.5625 0zm13.421875 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm28.117188 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm10.003906 4.359375l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm23.03125 5.53125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm19.878906 5.890625q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3945312 6.25l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm26.644531 0l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.539062 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm10.910156 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.84375 8.484375l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm10.644531 -0.0625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.124939 0 2.062439 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.87493896 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.503845 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.859375 -11.03125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm7.2695312 0l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.441406 -8.4375l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.2695312 0l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm9.925781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.9648438 6.6875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm17.183594 -4.5l4.984375 -17.765625l1.6875 0l-4.96875 17.765625l-1.703125 0zm14.9140625 4.46875l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.410156 6.15625l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm8.0234375 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.890625 0l0 1.75q0.59375 -0.90625 1.5625 -1.46875q0.96875 -0.5625 2.21875 -0.5625q1.375 0 2.25 0.578125q0.890625 0.578125 1.265625 1.609375q1.46875 -2.1875 3.84375 -2.1875q1.84375 0 2.84375 1.03125q1.0 1.03125 1.0 3.15625l0 8.546875l-2.109375 0l0 -7.84375q0 -1.265625 -0.203125 -1.8125q-0.203125 -0.5625 -0.75 -0.90625q-0.53125 -0.34375 -1.25 -0.34375q-1.3125 0 -2.1875 0.875q-0.859375 0.875 -0.859375 2.796875l0 7.234375l-2.109375 0l0 -8.09375q0 -1.40625 -0.515625 -2.109375q-0.515625 -0.703125 -1.6875 -0.703125q-0.890625 0 -1.65625 0.46875q-0.75 0.46875 -1.09375 1.375q-0.34375 0.90625 -0.34375 2.609375l0 6.453125l-2.109375 0zm28.117188 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3789062 6.25l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm7.9140625 4.796875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm18.761719 -0.03125l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm10.644531 -0.0625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.972656 -8.53125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm17.957031 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm7.9453125 -4.328125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm12.472656 6.21875l0 -10.8125l-1.875 0l0 -1.640625l1.875 0l0 -1.3125q0 -1.265625 0.21875 -1.875q0.296875 -0.8125 1.0625 -1.3125q0.78125 -0.515625 2.15625 -0.515625q0.890625 0 1.96875 0.203125l-0.3125 1.84375q-0.65625 -0.125 -1.25 -0.125q-0.953125 0 -1.359375 0.421875q-0.390625 0.40625 -0.390625 1.53125l0 1.140625l2.421875 0l0 1.640625l-2.421875 0l0 10.8125l-2.09375 0zm20.945312 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm3.09375 -1.65625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm17.957031 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.183594 0.359375q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm13.519531 1.6875l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm8.484375 2.671875l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm2.6679688 1.890625l0 -2.40625l2.390625 0l0 2.40625l-2.390625 0zm12.2265625 -5.515625l2.140625 -0.1875q0.15625 1.28125 0.703125 2.109375q0.5625 0.828125 1.734375 1.34375q1.171875 0.5 2.640625 0.5q1.296875 0 2.296875 -0.375q1.0 -0.390625 1.484375 -1.0625q0.484375 -0.6875 0.484375 -1.484375q0 -0.796875 -0.46875 -1.40625q-0.46875 -0.609375 -1.546875 -1.015625q-0.6875 -0.265625 -3.0625 -0.828125q-2.359375 -0.578125 -3.3125 -1.078125q-1.234375 -0.640625 -1.84375 -1.59375q-0.59375 -0.96875 -0.59375 -2.140625q0 -1.3125 0.734375 -2.4375q0.75 -1.125 2.15625 -1.703125q1.421875 -0.59375 3.15625 -0.59375q1.90625 0 3.359375 0.609375q1.46875 0.609375 2.25 1.8125q0.796875 1.1875 0.84375 2.703125l-2.171875 0.171875q-0.171875 -1.640625 -1.1875 -2.46875q-1.015625 -0.828125 -3.0 -0.828125q-2.0625 0 -3.015625 0.765625q-0.9375 0.75 -0.9375 1.8125q0 0.921875 0.671875 1.515625q0.65625 0.609375 3.421875 1.234375q2.78125 0.625 3.8125 1.09375q1.5 0.6875 2.203125 1.75q0.71875 1.0625 0.71875 2.4375q0 1.375 -0.78125 2.59375q-0.78125 1.203125 -2.25 1.890625q-1.46875 0.671875 -3.3125 0.671875q-2.328125 0 -3.90625 -0.671875q-1.578125 -0.6875 -2.484375 -2.046875q-0.890625 -1.375 -0.9375 -3.09375zm16.507812 10.28125l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm11.378906 6.15625l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm9.925781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.6796875 1.890625l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm10.644531 0.09375q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm10.550781 6.21875l4.546875 -6.46875l-4.203125 -5.984375l2.640625 0l1.90625 2.921875q0.546875 0.828125 0.875 1.390625q0.515625 -0.765625 0.9375 -1.359375l2.109375 -2.953125l2.515625 0l-4.296875 5.859375l4.625 6.59375l-2.59375 0l-2.546875 -3.875l-0.6875 -1.03125l-3.265625 4.90625l-2.5625 0zm21.9375 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm10.910156 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm19.527344 -11.03125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.3164062 0l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm21.425781 0l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm11.957031 -8.53125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm13.441406 -4.5625l2.078125 0.265625q-0.34375 2.15625 -1.75 3.375q-1.390625 1.203125 -3.4375 1.203125q-2.546875 0 -4.109375 -1.671875q-1.546875 -1.671875 -1.546875 -4.78125q0 -2.015625 0.671875 -3.53125q0.671875 -1.515625 2.03125 -2.265625q1.359375 -0.765625 2.96875 -0.765625q2.03125 0 3.3125 1.03125q1.296875 1.03125 1.65625 2.90625l-2.046875 0.328125q-0.296875 -1.265625 -1.046875 -1.890625q-0.734375 -0.640625 -1.796875 -0.640625q-1.59375 0 -2.59375 1.15625q-0.984375 1.140625 -0.984375 3.609375q0 2.5 0.953125 3.640625q0.96875 1.140625 2.515625 1.140625q1.234375 0 2.0625 -0.765625q0.84375 -0.765625 1.0625 -2.34375zm12.0 3.03125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm10.003906 4.359375l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm10.589844 -2.125l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm17.578125 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.84375 3.71875l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm21.472656 -1.53125q-1.171875 0.984375 -2.265625 1.40625q-1.078125 0.40625 -2.3125 0.40625q-2.046875 0 -3.15625 -1.0q-1.09375 -1.0 -1.09375 -2.5625q0 -0.921875 0.40625 -1.671875q0.421875 -0.75 1.09375 -1.203125q0.671875 -0.46875 1.515625 -0.703125q0.625 -0.15625 1.875 -0.3125q2.5625 -0.3125 3.765625 -0.734375q0.015625 -0.421875 0.015625 -0.546875q0 -1.28125 -0.609375 -1.8125q-0.796875 -0.71875 -2.390625 -0.71875q-1.5 0 -2.203125 0.53125q-0.703125 0.515625 -1.046875 1.84375l-2.0625 -0.28125q0.28125 -1.328125 0.921875 -2.140625q0.640625 -0.8125 1.859375 -1.25q1.21875 -0.453125 2.828125 -0.453125q1.59375 0 2.59375 0.375q1.0 0.375 1.46875 0.953125q0.46875 0.5625 0.65625 1.4375q0.09375 0.53125 0.09375 1.9375l0 2.8125q0 2.9375 0.140625 3.71875q0.140625 0.78125 0.53125 1.5l-2.203125 0q-0.328125 -0.65625 -0.421875 -1.53125zm-0.171875 -4.71875q-1.15625 0.46875 -3.453125 0.796875q-1.296875 0.1875 -1.84375 0.421875q-0.53125 0.234375 -0.828125 0.6875q-0.28125 0.453125 -0.28125 1.0q0 0.84375 0.625 1.40625q0.640625 0.5625 1.875 0.5625q1.21875 0 2.171875 -0.53125q0.953125 -0.53125 1.390625 -1.453125q0.34375 -0.71875 0.34375 -2.109375l0 -0.78125zm5.3789062 6.25l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.539062 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm19.832031 7.421875l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375zm18.59375 6.21875l0 -12.453125l1.890625 0l0 1.890625q0.734375 -1.328125 1.34375 -1.75q0.625 -0.421875 1.359375 -0.421875q1.0625 0 2.171875 0.6875l-0.734375 1.953125q-0.765625 -0.453125 -1.546875 -0.453125q-0.6875 0 -1.25 0.421875q-0.546875 0.40625 -0.78125 1.140625q-0.34375 1.125 -0.34375 2.46875l0 6.515625l-2.109375 0zm16.539062 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm10.910156 3.703125l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.84375 8.484375l0 -17.21875l1.921875 0l0 1.625q0.6875 -0.953125 1.53125 -1.421875q0.859375 -0.484375 2.078125 -0.484375q1.59375 0 2.8125 0.828125q1.21875 0.8125 1.84375 2.3125q0.625 1.5 0.625 3.28125q0 1.90625 -0.6875 3.4375q-0.6875 1.53125 -2.0 2.34375q-1.296875 0.8125 -2.734375 0.8125q-1.0625 0 -1.90625 -0.4375q-0.828125 -0.453125 -1.375 -1.140625l0 6.0625l-2.109375 0zm1.921875 -10.921875q0 2.40625 0.96875 3.5625q0.96875 1.140625 2.359375 1.140625q1.40625 0 2.40625 -1.1875q1.0 -1.1875 1.0 -3.6875q0 -2.375 -0.984375 -3.5625q-0.96875 -1.1875 -2.328125 -1.1875q-1.359375 0 -2.390625 1.265625q-1.03125 1.25 -1.03125 3.65625zm10.644531 -0.0625q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.957031 6.21875l0 -12.453125l1.90625 0l0 1.78125q1.375 -2.0625 3.953125 -2.0625q1.125 0 2.0625 0.40625q0.953125 0.40625 1.421875 1.0625q0.46875 0.65625 0.65625 1.5625q0.125 0.578125 0.125 2.046875l0 7.65625l-2.109375 0l0 -7.578125q0 -1.28125 -0.25 -1.921875q-0.25 -0.640625 -0.875 -1.015625q-0.625 -0.390625 -1.46875 -0.390625q-1.34375 0 -2.328125 0.859375q-0.984375 0.859375 -0.984375 3.25l0 6.796875l-2.109375 0zm12.503906 -3.71875l2.09375 -0.328125q0.171875 1.25 0.96875 1.921875q0.8125 0.671875 2.25 0.671875q1.453125 0 2.15625 -0.59375q0.703125 -0.59375 0.703125 -1.390625q0 -0.71875 -0.625 -1.125q-0.421875 -0.28125 -2.15625 -0.71875q-2.3125 -0.578125 -3.21875 -1.0q-0.890625 -0.4375 -1.359375 -1.1875q-0.453125 -0.765625 -0.453125 -1.671875q0 -0.828125 0.375 -1.53125q0.390625 -0.71875 1.046875 -1.1875q0.484375 -0.359375 1.328125 -0.609375q0.859375 -0.265625 1.828125 -0.265625q1.46875 0 2.578125 0.421875q1.109375 0.421875 1.625 1.15625q0.53125 0.71875 0.734375 1.921875l-2.0625 0.28125q-0.140625 -0.96875 -0.8125 -1.5q-0.671875 -0.546875 -1.90625 -0.546875q-1.453125 0 -2.078125 0.484375q-0.625 0.484375 -0.625 1.125q0 0.40625 0.265625 0.734375q0.25 0.34375 0.8125 0.5625q0.3125 0.125 1.859375 0.546875q2.234375 0.59375 3.109375 0.984375q0.890625 0.375 1.390625 1.109375q0.515625 0.71875 0.515625 1.796875q0 1.046875 -0.625 1.984375q-0.609375 0.9375 -1.765625 1.453125q-1.15625 0.5 -2.625 0.5q-2.421875 0 -3.703125 -1.0q-1.265625 -1.015625 -1.625 -3.0zm12.859375 -11.03125l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm7.2695312 0l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.441406 -8.4375l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm5.2695312 0l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm5.3945312 -14.75l0 -2.4375l2.109375 0l0 2.4375l-2.109375 0zm0 14.75l0 -12.453125l2.109375 0l0 12.453125l-2.109375 0zm9.925781 -1.890625l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.9648438 6.6875l-0.234375 -1.984375q0.703125 0.1875 1.21875 0.1875q0.703125 0 1.125 -0.234375q0.421875 -0.234375 0.6875 -0.65625q0.203125 -0.3125 0.640625 -1.5625q0.0625 -0.1875 0.1875 -0.515625l-4.71875 -12.484375l2.265625 0l2.59375 7.21875q0.5 1.359375 0.90625 2.875q0.359375 -1.453125 0.859375 -2.828125l2.671875 -7.265625l2.109375 0l-4.734375 12.671875q-0.765625 2.046875 -1.1875 2.8125q-0.5625 1.046875 -1.296875 1.53125q-0.71875 0.484375 -1.734375 0.484375q-0.609375 0 -1.359375 -0.25zm10.921875 -4.796875l0 -2.40625l2.390625 0l0 2.40625l-2.390625 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/cros-connectivity-layers&sa=D&source=editors&ust=1638577908338000&usg=AOvVaw10WcK-TOlAntBY-aoFINqD" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m996.59186 8.986878l312.1054 0l0 28.8l-312.1054 0l0 -28.8z" fill-rule="nonzero"/></a><path fill="#efefef" d="m95.30708 364.93045l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m95.30708 364.93045l225.48033 0l0 193.22836l-225.48033 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m158.67615 375.2439l98.74219 0l0 27.597656l-98.74219 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m160.42615 396.97046l0 -17.1875l5.5625 0q3.171875 0 4.125 0.265625q1.484375 0.390625 2.46875 1.6875q1.0 1.28125 1.0 3.34375q0 1.578125 -0.578125 2.65625q-0.5625 1.078125 -1.453125 1.703125q-0.890625 0.609375 -1.796875 0.796875q-1.25 0.25 -3.59375 0.25l-2.265625 0l0 6.484375l-3.46875 0zm3.46875 -14.28125l0 4.875l1.890625 0q2.0625 0 2.75 -0.265625q0.6875 -0.265625 1.078125 -0.84375q0.390625 -0.578125 0.390625 -1.328125q0 -0.9375 -0.546875 -1.546875q-0.546875 -0.609375 -1.390625 -0.765625q-0.625 -0.125 -2.5 -0.125l-1.671875 0zm14.9765625 5.625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm9.628906 5.984375l-3.296875 0l0 -12.453125l3.0625 0l0 1.78125q0.78125 -1.265625 1.40625 -1.65625q0.640625 -0.40625 1.4375 -0.40625q1.125 0 2.15625 0.625l-1.015625 2.875q-0.828125 -0.546875 -1.546875 -0.546875q-0.6875 0 -1.171875 0.390625q-0.484375 0.375 -0.765625 1.375q-0.265625 1.0 -0.265625 4.171875l0 3.84375zm8.652344 -8.65625l-2.984375 -0.53125q0.5 -1.8125 1.71875 -2.671875q1.234375 -0.875 3.671875 -0.875q2.203125 0 3.28125 0.53125q1.078125 0.515625 1.515625 1.328125q0.4375 0.796875 0.4375 2.9375l-0.03125 3.84375q0 1.640625 0.15625 2.421875q0.15625 0.78125 0.59375 1.671875l-3.265625 0q-0.125 -0.328125 -0.3125 -0.96875q-0.078125 -0.296875 -0.125 -0.390625q-0.84375 0.8125 -1.8125 1.234375q-0.953125 0.40625 -2.03125 0.40625q-1.921875 0 -3.03125 -1.046875q-1.109375 -1.046875 -1.109375 -2.640625q0 -1.046875 0.5 -1.875q0.5 -0.828125 1.40625 -1.265625q0.921875 -0.4375 2.625 -0.765625q2.3125 -0.4375 3.203125 -0.8125l0 -0.328125q0 -0.953125 -0.46875 -1.34375q-0.46875 -0.40625 -1.765625 -0.40625q-0.890625 0 -1.390625 0.34375q-0.484375 0.34375 -0.78125 1.203125zm4.40625 2.671875q-0.640625 0.21875 -2.015625 0.515625q-1.359375 0.28125 -1.78125 0.5625q-0.640625 0.46875 -0.640625 1.171875q0 0.6875 0.515625 1.1875q0.515625 0.5 1.3125 0.5q0.890625 0 1.6875 -0.578125q0.609375 -0.453125 0.796875 -1.09375q0.125 -0.421875 0.125 -1.609375l0 -0.65625zm6.4726562 5.984375l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm6.6679688 0l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm13.886719 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm5.9414062 7.296875l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm5.5117188 -3.546875l3.3125 -0.515625q0.203125 0.96875 0.84375 1.46875q0.65625 0.5 1.8125 0.5q1.28125 0 1.921875 -0.46875q0.4375 -0.328125 0.4375 -0.890625q0 -0.375 -0.234375 -0.609375q-0.25 -0.234375 -1.109375 -0.4375q-3.984375 -0.875 -5.046875 -1.609375q-1.484375 -1.0 -1.484375 -2.796875q0 -1.625 1.28125 -2.71875q1.28125 -1.109375 3.96875 -1.109375q2.546875 0 3.78125 0.84375q1.25 0.828125 1.71875 2.453125l-3.109375 0.578125q-0.1875 -0.734375 -0.75 -1.109375q-0.5625 -0.390625 -1.59375 -0.390625q-1.296875 0 -1.859375 0.359375q-0.375 0.265625 -0.375 0.671875q0 0.34375 0.328125 0.59375q0.453125 0.328125 3.078125 0.9375q2.625 0.59375 3.671875 1.453125q1.03125 0.875 1.03125 2.453125q0 1.703125 -1.4375 2.9375q-1.421875 1.234375 -4.21875 1.234375q-2.546875 0 -4.03125 -1.03125q-1.484375 -1.03125 -1.9375 -2.796875z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m257.41833 375.2439l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#000099" d="m158.67615 398.53046l98.74219 0l0 2.1600037l-98.74219 0l0 -2.1600037z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/parallels&sa=D&source=editors&ust=1638577908342000&usg=AOvVaw148vfJn_nrvHzymr64ovGQ" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m158.67615 373.93045l98.74219 0l0 28.799988l-98.74219 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m21.83727 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m57.467297 686.9142l64.2675 0l0 21.45288l-64.2675 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m58.998547 703.8032l0 -13.359375l9.015629 0l0 1.578125l-7.250004 0l0 4.140625l6.265629 0l0 1.578125l-6.265629 0l0 6.0625l-1.765625 0zm11.09911 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.129196 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853302 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm10.922592 5.765625l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.156967 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.144821 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m121.7348 686.9142l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m57.467297 705.01654l64.2675 0l0 1.6799927l-64.2675 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/firewall.h&sa=D&source=editors&ust=1638577908344000&usg=AOvVaw2PHaKWNBVZQprhZlBvgEYV" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m57.467297 685.8832l64.2675 0l0 22.400024l-64.2675 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.40369 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.40369 674.395l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m209.85042 686.9142l74.63411 0l0 21.45288l-74.63411 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m211.2723 703.8032l0 -13.359375l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359375l-1.8125 0l-7.015625 -10.5l0 10.5l-1.6875 0zm13.488571 0l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.707321 1.578125l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.459198 7.0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.6189117 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.203857 4.84375l3.53125 -5.03125l-3.265625 -4.640625l2.046875 0l1.484375 2.265625q0.421875 0.640625 0.671875 1.078125q0.40625 -0.59375 0.734375 -1.0625l1.640625 -2.28125l1.953125 0l-3.34375 4.546875l3.59375 5.125l-2.015625 0l-1.984375 -3.0l-0.515625 -0.8125l-2.546875 3.8125l-1.984375 0zm10.34375 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m284.48453 686.9142l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m209.85042 705.01654l74.63411 0l0 1.6799927l-74.63411 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/ndproxy.h&sa=D&source=editors&ust=1638577908346000&usg=AOvVaw1UgsvT1ZsJPSAu_A6eqAH5" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m209.85042 685.8832l74.63411 0l0 22.400024l-74.63411 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m775.35956 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m775.35956 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m788.8585 795.5769l73.63208 0l0 21.45288l-73.63208 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m790.24915 812.46594l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm21.697021 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.2038574 4.859375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.688232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.8913574 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953796 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m862.4906 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m788.8585 813.67926l73.63208 0l0 1.6799927l-73.63208 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/manager.h&sa=D&source=editors&ust=1638577908348000&usg=AOvVaw2-GEVnopsJQSi2fuFmH9G1" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m788.8585 794.54596l73.63208 0l0 22.399963l-73.63208 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461344931474438 0.0 0.0 10.461344931474438 0.0 0.0)" spreadMethod="pad" x1="75.66739098562421" y1="77.00218558523139" x2="68.27017360807059" y2="69.60482708070391"><stop offset="0.0" stop-color="#dd7e6b"/><stop offset="0.5" stop-color="#dd7e6b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.6)" d="m663.8819 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m663.8819 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m695.5497 795.5769l37.29431 0l0 21.45288l-37.29431 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m699.3153 812.46594l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm15.077454 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.4416504 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m732.844 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m695.5497 813.67926l37.29431 0l0 1.6799927l-37.29431 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/wifi/wifi.h&sa=D&source=editors&ust=1638577908354000&usg=AOvVaw3A97TOcedFMCbtI2HLRy1F" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m695.5497 794.54596l37.29431 0l0 22.399963l-37.29431 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.7" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461347703443927 0.0 0.0 10.461347703443927 0.0 0.0)" spreadMethod="pad" x1="107.83553121986976" y1="77.00216518176951" x2="100.43830796199" y2="69.60480863733865"><stop offset="0.0" stop-color="#8e7cc3"/><stop offset="0.5" stop-color="#8e7cc3"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.7)" d="m1000.4042 778.47504l100.630005 0l0 54.141785l-100.630005 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1000.4042 778.47504l100.630005 0l0 54.141785l-100.630005 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1019.0955 795.5769l63.247253 0l0 21.45288l-63.247253 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1030.0643 807.77844l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515686 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484436 -0.8125 3.250061 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578186 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046936 0.625 2.265686 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm10.363525 1.578125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.094482 5.765625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1447754 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519897 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.0007324 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.50415 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1082.3428 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m1019.0955 813.67926l63.247253 0l0 1.6799927l-63.247253 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/cellular/cellular.h&sa=D&source=editors&ust=1638577908356000&usg=AOvVaw1vTwDcu1mpEOqtIHxz2r9g" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1019.0955 794.54596l63.247253 0l0 22.399963l-63.247253 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#6d9eeb" d="m889.57086 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m889.57086 778.47504l100.629944 0l0 54.141785l-100.629944 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m904.623 795.5769l70.525696 0l0 21.45288l-70.525696 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m906.09174 812.46594l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm15.7872925 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m975.1487 795.5769l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m904.623 813.67926l70.525696 0l0 1.6799927l-70.525696 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/ethernet/ethernet.h&sa=D&source=editors&ust=1638577908358000&usg=AOvVaw3biFSa9mbkEwor6Bzumzgu" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m904.623 794.54596l70.525696 0l0 22.399963l-70.525696 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461347703443927 0.0 0.0 10.461347703443927 0.0 0.0)" spreadMethod="pad" x1="54.50410098866407" y1="76.91786535838355" x2="47.10687773078431" y2="69.52050881395267"><stop offset="0.0" stop-color="#f6b26b"/><stop offset="0.5" stop-color="#f6b26b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.8)" d="m442.48557 777.5932l100.62991 0l0 54.141724l-100.62991 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m442.48557 777.5932l100.62991 0l0 54.141724l-100.62991 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m473.62048 783.695l38.360077 0l0 21.45288l-38.360077 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m478.87048 800.58405l-5.171875 -13.359375l1.921875 0l3.46875 9.703125q0.421875 1.171875 0.703125 2.1875q0.3125 -1.09375 0.71875 -2.1875l3.609375 -9.703125l1.796875 0l-5.234375 13.359375l-1.8125 0zm8.631073 0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.662323 7.0l0 -13.359375l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359375l-1.8125 0l-7.015625 -10.5l0 10.5l-1.6875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m511.98056 783.695l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m473.62048 801.79736l38.360077 0l0 1.6799927l-38.360077 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m461.69614 805.695l62.20877 0l0 21.45288l-62.20877 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m462.5399 818.2872l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459198 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.915802 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457306 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m523.9049 805.695l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m461.69614 823.79736l62.20877 0l0 1.6799927l-62.20877 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/vpn/vpn_service.h&sa=D&source=editors&ust=1638577908363000&usg=AOvVaw2zg2aHxdX1UdzAnDjKObQ7" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m473.62048 782.66406l38.360077 0l0 22.399963l-38.360077 0l0 -22.399963z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/vpn/vpn_service.h&sa=D&source=editors&ust=1638577908363000&usg=AOvVaw2zg2aHxdX1UdzAnDjKObQ7" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m461.69614 804.66406l62.20877 0l0 22.399963l-62.20877 0l0 -22.399963z" fill-rule="nonzero"/></a><defs><linearGradient id="p.9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.461347703443927 0.0 0.0 10.461347703443927 0.0 0.0)" spreadMethod="pad" x1="65.32182956639483" y1="76.91786535838355" x2="57.92460630851507" y2="69.52050881395267"><stop offset="0.0" stop-color="#f6b26b"/><stop offset="0.5" stop-color="#f6b26b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.9)" d="m555.65356 777.5932l100.62988 0l0 54.141724l-100.62988 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m555.65356 777.5932l100.62988 0l0 54.141724l-100.62988 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m570.191 794.695l71.55505 0l0 21.45288l-71.55505 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m571.92535 811.58405l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.8864136 0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm20.209167 2.3125l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.1292114 -0.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.766357 0l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.7926636 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.8323364 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m641.74603 794.695l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m570.191 812.79736l71.55505 0l0 1.6799927l-71.55505 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/ipconfig.h&sa=D&source=editors&ust=1638577908365000&usg=AOvVaw3IXATGun4oVNE2J1C9srPL" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m570.191 793.66406l71.55505 0l0 22.399963l-71.55505 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#b6d7a8" d="m85.13386 1028.1326l197.66931 0l0 79.149536l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m85.13386 1028.1326l197.66931 0l0 79.149536l-197.66931 0z" fill-rule="evenodd"/><path fill="#000000" d="m143.72734 1058.7556l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.844467 4.78125l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.9958038 1.46875l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.183304 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281967 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm23.697052 -1.578125l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm0.9851074 1.8125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m123.308365 1060.1636l121.32028 0l0 21.45288l-121.32028 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m123.745865 1074.2869l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm10.063217 -6.90625l2.71875 0l2.328125 6.859375l2.25 -6.859375l2.65625 0l-3.421875 9.3125l-0.609375 1.6875q-0.328125 0.84375 -0.640625 1.28125q-0.3125 0.453125 -0.703125 0.71875q-0.390625 0.28125 -0.96875 0.4375q-0.578125 0.15625 -1.3125 0.15625q-0.734375 0 -1.453125 -0.15625l-0.21875 -2.0q0.59375 0.125 1.078125 0.125q0.890625 0 1.3125 -0.53125q0.4375 -0.515625 0.671875 -1.328125l-3.6875 -9.703125zm10.688217 6.90625l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm15.719467 -6.90625l0 2.03125l-1.75 0l0 3.90625q0 1.1875 0.046875 1.390625q0.046875 0.1875 0.21875 0.3125q0.1875 0.125 0.4375 0.125q0.359375 0 1.03125 -0.25l0.21875 2.0q-0.890625 0.375 -2.015625 0.375q-0.703125 0 -1.265625 -0.234375q-0.546875 -0.234375 -0.8125 -0.59375q-0.25 -0.375 -0.34375 -1.0q-0.09375 -0.453125 -0.09375 -1.8125l0 -4.21875l-1.171875 0l0 -2.03125l1.171875 0l0 -1.921875l2.578125 -1.5l0 3.421875l1.75 0zm7.368927 6.59375l2.546875 0.421875q-0.484375 1.40625 -1.546875 2.140625q-1.0625 0.734375 -2.65625 0.734375q-2.515625 0 -3.734375 -1.65625q-0.953125 -1.3125 -0.953125 -3.328125q0 -2.40625 1.25 -3.765625q1.265625 -1.359375 3.1875 -1.359375q2.15625 0 3.40625 1.421875q1.25 1.421875 1.1875 4.375l-6.40625 0q0.03125 1.140625 0.609375 1.78125q0.59375 0.625 1.484375 0.625q0.59375 0 1.0 -0.328125q0.421875 -0.328125 0.625 -1.0625zm0.15625 -2.59375q-0.03125 -1.109375 -0.578125 -1.6875q-0.546875 -0.578125 -1.328125 -0.578125q-0.84375 0 -1.390625 0.609375q-0.546875 0.609375 -0.53125 1.65625l3.828125 0zm4.422592 -4.0l2.359375 0l0 1.3125q1.265625 -1.53125 3.015625 -1.53125q0.9375 0 1.609375 0.390625q0.6875 0.375 1.125 1.140625q0.640625 -0.765625 1.375 -1.140625q0.75 -0.390625 1.578125 -0.390625q1.0625 0 1.796875 0.4375q0.75 0.421875 1.109375 1.265625q0.265625 0.625 0.265625 2.0l0 6.1875l-2.5625 0l0 -5.53125q0 -1.4375 -0.265625 -1.859375q-0.34375 -0.546875 -1.09375 -0.546875q-0.53125 0 -1.015625 0.328125q-0.46875 0.328125 -0.671875 0.96875q-0.203125 0.625 -0.203125 2.0l0 4.640625l-2.5625 0l0 -5.296875q0 -1.421875 -0.140625 -1.828125q-0.140625 -0.40625 -0.421875 -0.609375q-0.28125 -0.203125 -0.78125 -0.203125q-0.59375 0 -1.0625 0.328125q-0.46875 0.3125 -0.6875 0.921875q-0.203125 0.59375 -0.203125 1.984375l0 4.703125l-2.5625 0l0 -9.671875zm16.494644 6.109375l0 -2.5625l5.03125 0l0 2.5625l-5.03125 0zm6.431427 -6.109375l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm11.395981 5.0l-2.5625 0l0 -9.671875l2.375 0l0 1.375q0.609375 -0.984375 1.09375 -1.28125q0.484375 -0.3125 1.109375 -0.3125q0.875 0 1.6875 0.484375l-0.796875 2.234375q-0.640625 -0.421875 -1.203125 -0.421875q-0.53125 0 -0.90625 0.296875q-0.375 0.296875 -0.59375 1.078125q-0.203125 0.765625 -0.203125 3.234375l0 2.984375zm4.2134094 -4.96875q0 -1.28125 0.625 -2.46875q0.625 -1.203125 1.78125 -1.828125q1.15625 -0.625 2.578125 -0.625q2.1875 0 3.59375 1.421875q1.40625 1.421875 1.40625 3.609375q0 2.1875 -1.421875 3.640625q-1.421875 1.4375 -3.5625 1.4375q-1.328125 0 -2.546875 -0.59375q-1.203125 -0.609375 -1.828125 -1.765625q-0.625 -1.171875 -0.625 -2.828125zm2.625 0.125q0 1.453125 0.671875 2.21875q0.6875 0.75 1.6875 0.75q1.0 0 1.671875 -0.75q0.6875 -0.765625 0.6875 -2.234375q0 -1.421875 -0.6875 -2.1875q-0.671875 -0.765625 -1.671875 -0.765625q-1.0 0 -1.6875 0.765625q-0.671875 0.765625 -0.671875 2.203125zm8.130341 4.84375l3.484375 -4.984375l-3.34375 -4.6875l3.125 0l1.71875 2.65625l1.796875 -2.65625l3.015625 0l-3.28125 4.578125l3.578125 5.09375l-3.140625 0l-1.96875 -3.0l-1.984375 3.0l-3.0 0zm10.391357 -9.671875l2.71875 0l2.328125 6.859375l2.25 -6.859375l2.65625 0l-3.421875 9.3125l-0.609375 1.6875q-0.328125 0.84375 -0.640625 1.28125q-0.3125 0.453125 -0.703125 0.71875q-0.390625 0.28125 -0.96875 0.4375q-0.578125 0.15625 -1.3125 0.15625q-0.734375 0 -1.453125 -0.15625l-0.21875 -2.0q0.59375 0.125 1.078125 0.125q0.890625 0 1.3125 -0.53125q0.4375 -0.515625 0.671875 -1.328125l-3.6875 -9.703125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m244.62865 1060.1636l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m123.308365 1078.2659l121.32028 0l0 1.6800537l-121.32028 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://cs/chromeos_public/src/platform2/system-proxy/&sa=D&source=editors&ust=1638577908370000&usg=AOvVaw1HYYmp8XSa68x_8Z7y_ow5" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m123.308365 1059.1326l121.32028 0l0 22.400024l-121.32028 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m395.38846 285.48294l148.85037 0l0 37.5748l-148.85037 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m395.38846 285.48294l148.85037 0l0 37.5748l-148.85037 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m411.28503 295.21735l117.05719 0l0 15.32605l-117.05719 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m416.67566 304.75168l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm11.1024475 2.65625l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm5.9124756 -0.03125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.6717224 -1.015625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm6.2578125 2.21875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm9.093628 -1.015625q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9749756 3.46875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.9696045 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.2734375 2.6875l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm4.578003 -0.15625l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m528.3422 295.21735l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m411.28503 308.1496l117.05725 0l0 1.2000122l-117.05725 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:components/arc/net/&sa=D&source=editors&ust=1638577908373000&usg=AOvVaw3lw2gV5L-Q06nkyJFODoJn" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m411.28503 294.48294l117.05725 0l0 16.0l-117.05725 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#dd7e6b" d="m629.29395 1198.9606l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m629.29395 1198.9606l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m645.8408 1218.192l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.40625 3.546875l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.4802246 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm11.391296 -2.21875q-1.015625 -0.375 -1.515625 -1.0625q-0.484375 -0.703125 -0.484375 -1.671875q0 -1.453125 1.046875 -2.4375q1.046875 -1.0 2.78125 -1.0q1.75 0 2.8125 1.015625q1.078125 1.015625 1.078125 2.46875q0 0.9375 -0.5 1.625q-0.484375 0.6875 -1.46875 1.0625q1.21875 0.390625 1.859375 1.28125q0.65625 0.890625 0.65625 2.140625q0 1.703125 -1.21875 2.875q-1.21875 1.171875 -3.1875 1.171875q-1.984375 0 -3.203125 -1.171875q-1.203125 -1.171875 -1.203125 -2.921875q0 -1.3125 0.65625 -2.1875q0.671875 -0.875 1.890625 -1.1875zm-0.328125 -2.78125q0 0.9375 0.609375 1.546875q0.609375 0.59375 1.59375 0.59375q0.9375 0 1.546875 -0.59375q0.609375 -0.59375 0.609375 -1.453125q0 -0.90625 -0.625 -1.515625q-0.625 -0.625 -1.5625 -0.625q-0.9375 0 -1.5625 0.609375q-0.609375 0.59375 -0.609375 1.4375zm-0.53125 6.15625q0 0.703125 0.328125 1.359375q0.34375 0.65625 1.0 1.015625q0.65625 0.359375 1.40625 0.359375q1.171875 0 1.9375 -0.75q0.765625 -0.75 0.765625 -1.921875q0 -1.1875 -0.796875 -1.953125q-0.78125 -0.78125 -1.953125 -0.78125q-1.15625 0 -1.921875 0.765625q-0.765625 0.765625 -0.765625 1.90625zm8.719482 -2.734375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm17.313232 5.015625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm7.9382324 1.578125l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625zm8.990295 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><path fill="#dd7e6b" d="m762.1312 1198.9895l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m762.1312 1198.9895l115.37012 0l0 31.716553l-115.37012 0z" fill-rule="evenodd"/><path fill="#000000" d="m772.3656 1221.7678l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.853333 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.516296 1.3125l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm5.078125 -3.6875q-1.015625 -0.375 -1.515625 -1.0625q-0.484375 -0.703125 -0.484375 -1.671875q0 -1.453125 1.046875 -2.4375q1.046875 -1.0 2.78125 -1.0q1.75 0 2.8125 1.015625q1.078125 1.015625 1.078125 2.46875q0 0.9375 -0.5 1.625q-0.484375 0.6875 -1.46875 1.0625q1.21875 0.390625 1.859375 1.28125q0.65625 0.890625 0.65625 2.140625q0 1.703125 -1.21875 2.875q-1.21875 1.171875 -3.1875 1.171875q-1.984375 0 -3.203125 -1.171875q-1.203125 -1.171875 -1.203125 -2.921875q0 -1.3125 0.65625 -2.1875q0.671875 -0.875 1.890625 -1.1875zm-0.328125 -2.78125q0 0.9375 0.609375 1.546875q0.609375 0.59375 1.59375 0.59375q0.9375 0 1.546875 -0.59375q0.609375 -0.59375 0.609375 -1.453125q0 -0.90625 -0.625 -1.515625q-0.625 -0.625 -1.5625 -0.625q-0.9375 0 -1.5625 0.609375q-0.609375 0.59375 -0.609375 1.4375zm-0.53125 6.15625q0 0.703125 0.328125 1.359375q0.34375 0.65625 1.0 1.015625q0.65625 0.359375 1.40625 0.359375q1.171875 0 1.9375 -0.75q0.765625 -0.75 0.765625 -1.921875q0 -1.1875 -0.796875 -1.953125q-0.78125 -0.78125 -1.953125 -0.78125q-1.15625 0 -1.921875 0.765625q-0.765625 0.765625 -0.765625 1.90625zm8.719482 -2.734375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm17.313232 5.015625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm7.9382324 1.578125l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625zm8.990295 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m797.91864 1082.5487l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286194 -5.286255l-117.837036 0c-1.4020386 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.99139404 0.991333 -1.5482788 2.3359375 -1.5482788 3.737915l0 21.144043c0 2.9195557 2.3666992 5.286255 5.286194 5.286255l117.837036 0c2.9194946 0 5.286194 -2.3666992 5.286194 -5.286255z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m797.91864 1082.5487l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286194 -5.286255l-117.837036 0c-1.4020386 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.99139404 0.991333 -1.5482788 2.3359375 -1.5482788 3.737915l0 21.144043c0 2.9195557 2.3666992 5.286255 5.286194 5.286255l117.837036 0c2.9194946 0 5.286194 -2.3666992 5.286194 -5.286255z" fill-rule="evenodd"/><path fill="#000000" d="m681.2918 1100.0408l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.328857 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm6.2542114 -7.234375q-1.015625 -0.375 -1.515625 -1.0625q-0.484375 -0.703125 -0.484375 -1.671875q0 -1.453125 1.046875 -2.4375q1.046875 -1.0 2.78125 -1.0q1.75 0 2.8125 1.015625q1.078125 1.015625 1.078125 2.46875q0 0.9375 -0.5 1.625q-0.484375 0.6875 -1.46875 1.0625q1.21875 0.390625 1.859375 1.28125q0.65625 0.890625 0.65625 2.140625q0 1.703125 -1.21875 2.875q-1.21875 1.171875 -3.1875 1.171875q-1.984375 0 -3.203125 -1.171875q-1.203125 -1.171875 -1.203125 -2.921875q0 -1.3125 0.65625 -2.1875q0.671875 -0.875 1.890625 -1.1875zm-0.328125 -2.78125q0 0.9375 0.609375 1.546875q0.609375 0.59375 1.59375 0.59375q0.9375 0 1.546875 -0.59375q0.609375 -0.59375 0.609375 -1.453125q0 -0.90625 -0.625 -1.515625q-0.625 -0.625 -1.5625 -0.625q-0.9375 0 -1.5625 0.609375q-0.609375 0.59375 -0.609375 1.4375zm-0.53125 6.15625q0 0.703125 0.328125 1.359375q0.34375 0.65625 1.0 1.015625q0.65625 0.359375 1.40625 0.359375q1.171875 0 1.9375 -0.75q0.765625 -0.75 0.765625 -1.921875q0 -1.1875 -0.796875 -1.953125q-0.78125 -0.78125 -1.953125 -0.78125q-1.15625 0 -1.921875 0.765625q-0.765625 0.765625 -0.765625 1.90625zm8.719482 -2.734375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm17.313171 5.015625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm7.9382324 1.578125l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625zm8.990295 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><defs><linearGradient id="p.10" gradientUnits="userSpaceOnUse" gradientTransform="matrix(11.918226986797135 0.0 0.0 11.918226986797135 0.0 0.0)" spreadMethod="pad" x1="68.35226382061998" y1="72.74442591275768" x2="59.92488040065302" y2="64.31689108923511"><stop offset="0.0" stop-color="#dd7e6b"/><stop offset="0.5" stop-color="#dd7e6b"/><stop offset="0.51" stop-color="#6d9eeb"/><stop offset="1.0" stop-color="#6d9eeb"/></linearGradient></defs><path fill="url(#p.10)" d="m632.54333 848.19684l163.30707 0l0 37.57483l-163.30707 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m632.54333 848.19684l163.30707 0l0 37.57483l-163.30707 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m654.5752 857.01526l119.24335 0l0 21.45282l-119.24335 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m656.0127 873.90424l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm9.8654175 2.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.8064575 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1569824 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.3947754 0l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm18.129211 -1.53125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230164 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453857 2.21875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m773.81854 857.01526l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m654.5752 875.11755l119.243286 0l0 1.6800537l-119.243286 0l0 -1.6800537z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/shill/portal_detector.h?q%3Dportal%26sq%3Dpackage:chromeos_public&sa=D&source=editors&ust=1638577908382000&usg=AOvVaw3bS8kQbkxq0I9hP8Z4-PB1" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m654.5752 855.98425l119.243286 0l0 22.400024l-119.243286 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#d9d9d9" d="m470.15485 1082.6628l0 0c0 -2.9194336 2.3667297 -5.286255 5.286194 -5.286255l98.71893 0c1.4020386 0 2.746582 0.55700684 3.737915 1.5483398c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.919464 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m470.15485 1082.6628l0 0c0 -2.9194336 2.3667297 -5.286255 5.286194 -5.286255l98.71893 0c1.4020386 0 2.746582 0.55700684 3.737915 1.5483398c0.99139404 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.919464 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path fill="#000000" d="m499.0708 1100.1549l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.1250305 0 -3.3750305 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.2656555 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.2187805 0q0.09375 1.59375 0.90625 2.453125q0.8125305 0.84375 2.0156555 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.3906555 -2.65625l5.4062805 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.9062805 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719452 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5583496 1.46875l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1916504 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448364 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.375732 0l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0z" fill-rule="nonzero"/><path fill="#f6b26b" d="m21.83727 731.7635l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 731.7635l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m52.79868 733.28265l73.60474 0l0 21.45288l-73.60474 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m54.189304 750.1717l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.2031288 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.8750038 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm21.71268 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.000717 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm7.769821 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457321 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.328125 2.359375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.5475922 1.96875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m126.40342 733.28265l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m52.79868 751.385l73.60474 0l0 1.6799927l-73.60474 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m47.096134 755.28265l85.00983 0l0 21.45288l-85.00983 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m48.627384 772.1717l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm10.489731 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0000038 0 3.2656288 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.3281288 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.2187538 0 2.0312538 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.0312538 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281971 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.009552 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.188217 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.493927 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906967 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.4687424 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.6249924 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m132.10596 755.28265l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m47.096134 773.385l85.00983 0l0 1.6799927l-85.00983 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/multicast_forwarder.h?q%3Dmulticast%26ss%3Dpiper%252FGoogle%252Fchromeos_public:src%252Fplatform2%252Fpatchpanel%252F&sa=D&source=editors&ust=1638577908387000&usg=AOvVaw3KmT_wONhySwXI6hSr8WwW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m52.79868 732.25165l73.60474 0l0 22.400024l-73.60474 0l0 -22.400024z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/multicast_forwarder.h?q%3Dmulticast%26ss%3Dpiper%252FGoogle%252Fchromeos_public:src%252Fplatform2%252Fpatchpanel%252F&sa=D&source=editors&ust=1638577908387000&usg=AOvVaw3KmT_wONhySwXI6hSr8WwW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m47.096134 754.25165l85.00983 0l0 22.400024l-85.00983 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.40369 731.7644l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.40369 731.7644l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m204.14331 744.2836l86.04831 0l0 21.45282l-86.04831 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m204.11206 761.1726l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.052948 5.484375l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.629196 1.578125l0 -13.359375l5.015625 0q1.53125 0 2.453125 0.40625q0.921875 0.40625 1.4375 1.25q0.53125 0.84375 0.53125 1.765625q0 0.859375 -0.46875 1.625q-0.453125 0.75 -1.390625 1.203125q1.203125 0.359375 1.859375 1.21875q0.65625 0.859375 0.65625 2.015625q0 0.9375 -0.40625 1.75q-0.390625 0.796875 -0.984375 1.234375q-0.578125 0.4375 -1.453125 0.671875q-0.875 0.21875 -2.15625 0.21875l-5.09375 0zm1.78125 -7.75l2.875 0q1.1875 0 1.6875 -0.140625q0.671875 -0.203125 1.015625 -0.671875q0.34375 -0.46875 0.34375 -1.171875q0 -0.65625 -0.328125 -1.15625q-0.3125 -0.515625 -0.90625 -0.703125q-0.59375 -0.1875 -2.03125 -0.1875l-2.65625 0l0 4.03125zm0 6.171875l3.3125 0q0.859375 0 1.203125 -0.0625q0.609375 -0.109375 1.015625 -0.359375q0.421875 -0.265625 0.6875 -0.75q0.265625 -0.484375 0.265625 -1.125q0 -0.75 -0.390625 -1.296875q-0.375 -0.546875 -1.0625 -0.765625q-0.671875 -0.234375 -1.953125 -0.234375l-3.078125 0l0 4.59375zm10.740448 1.578125l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.459213 7.0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.618927 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.203827 4.84375l3.53125 -5.03125l-3.265625 -4.640625l2.046875 0l1.484375 2.265625q0.421875 0.640625 0.671875 1.078125q0.40625 -0.59375 0.734375 -1.0625l1.640625 -2.28125l1.953125 0l-3.34375 4.546875l3.59375 5.125l-2.015625 0l-1.984375 -3.0l-0.515625 -0.8125l-2.546875 3.8125l-1.984375 0zm10.34375 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m290.19162 744.2836l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m204.14331 762.3859l86.04831 0l0 1.6799927l-86.04831 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/adb_proxy.h;l%3D28&sa=D&source=editors&ust=1638577908389000&usg=AOvVaw0gVT2WOXF8koo6WRO5yC4V" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m204.14331 743.2526l86.04831 0l0 22.399963l-86.04831 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m21.83727 789.13324l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 789.13324l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m51.751087 790.65247l75.69992 0l0 21.45282l-75.69992 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m62.719837 802.85394l1.7656288 0.453125q-0.5625038 2.171875 -2.0000038 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.9062538 2.875l-1.7343788 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.1292 -0.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625717 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm4.047592 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953842 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230179 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.572052 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m127.45101 790.65247l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m51.751087 808.75476l75.69992 0l0 1.6799927l-75.69992 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m58.49667 812.65247l62.20876 0l0 21.45282l-62.20876 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m59.34042 825.24457l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625038 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.8281288 -0.453125 -2.5625038 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.4531288 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.6093788 0 -2.3437538 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.6562538 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125038 0 -3.0468788 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459202 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.915802 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457321 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m120.70543 812.65247l0 0l0 21.45282l0 0l0 -21.45282z" fill-rule="nonzero"/><path fill="#000099" d="m58.49667 830.75476l62.20876 0l0 1.6799927l-62.20876 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/counters_service.h&sa=D&source=editors&ust=1638577908391000&usg=AOvVaw0YAbPUSZ8IkHfxKvVtjF2X" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m51.751087 789.62146l75.69992 0l0 22.399963l-75.69992 0l0 -22.399963z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/counters_service.h&sa=D&source=editors&ust=1638577908391000&usg=AOvVaw0YAbPUSZ8IkHfxKvVtjF2X" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m58.49667 811.62146l62.20876 0l0 22.399963l-62.20876 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.40369 789.13513l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.40369 789.13513l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m215.0155 790.6543l64.303925 0l0 21.45288l-64.303925 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m216.48425 807.54333l0 -13.359375l5.921875 0q1.78125 0 2.703125 0.359375q0.9375 0.359375 1.484375 1.28125q0.5625 0.90625 0.5625 2.015625q0 1.40625 -0.921875 2.390625q-0.921875 0.96875 -2.84375 1.234375q0.703125 0.34375 1.078125 0.671875q0.765625 0.703125 1.453125 1.765625l2.328125 3.640625l-2.21875 0l-1.765625 -2.78125q-0.78125 -1.203125 -1.28125 -1.828125q-0.5 -0.640625 -0.90625 -0.890625q-0.390625 -0.265625 -0.796875 -0.359375q-0.296875 -0.078125 -0.984375 -0.078125l-2.046875 0l0 5.9375l-1.765625 0zm1.765625 -7.453125l3.796875 0q1.21875 0 1.890625 -0.25q0.6875 -0.265625 1.046875 -0.8125q0.359375 -0.546875 0.359375 -1.1875q0 -0.953125 -0.6875 -1.5625q-0.6875 -0.609375 -2.1875 -0.609375l-4.21875 0l0 4.421875zm10.863571 2.609375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625717 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.625717 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.063232 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m279.31943 790.6543l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m215.0155 808.75665l64.303925 0l0 1.6799927l-64.303925 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m216.0631 812.6543l62.208755 0l0 21.45288l-62.208755 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m216.90685 825.24646l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459198 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm8.915802 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457306 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m278.27185 812.6543l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m216.0631 830.75665l62.208755 0l0 1.6799927l-62.208755 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/routing_service.h&sa=D&source=editors&ust=1638577908396000&usg=AOvVaw3mNpdQWHUGqgQAz3RILJEc" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m215.0155 789.62335l64.303925 0l0 22.399963l-64.303925 0l0 -22.399963z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/routing_service.h&sa=D&source=editors&ust=1638577908396000&usg=AOvVaw3mNpdQWHUGqgQAz3RILJEc" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m216.0631 811.62335l62.208755 0l0 22.399963l-62.208755 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#d9d9d9" d="m346.93045 1082.6642l0 0c0 -2.9195557 2.3666992 -5.286255 5.286194 -5.286255l98.71893 0c1.402008 0 2.7465515 0.55700684 3.737915 1.5483398c0.9913635 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m346.93045 1082.6642l0 0c0 -2.9195557 2.3666992 -5.286255 5.286194 -5.286255l98.71893 0c1.402008 0 2.7465515 0.55700684 3.737915 1.5483398c0.9913635 0.991333 1.5482788 2.3359375 1.5482788 3.737915l0 21.144165c0 2.9194336 -2.3666992 5.286133 -5.286194 5.286133l-98.71893 0c-2.9194946 0 -5.286194 -2.3666992 -5.286194 -5.286133z" fill-rule="evenodd"/><path fill="#000000" d="m370.13275 1100.1562l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm9.806427 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.46875l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5582886 1.46875l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1917114 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.375732 0l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m300.44504 1148.4199l202.36221 0l0 37.57483l-202.36221 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m300.44504 1148.4199l202.36221 0l0 37.57483l-202.36221 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m335.78268 1157.2383l131.68689 0l0 21.45288l-131.68689 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m337.25143 1174.1273l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm15.787323 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm13.054108 1.46875l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266327 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323364 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.572052 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m467.46957 1157.2383l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m335.78268 1175.3407l131.68689 0l0 1.6799316l-131.68689 0l0 -1.6799316z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://go/cros-ethernet-status&sa=D&source=editors&ust=1638577908401000&usg=AOvVaw2fX3wgsR5SJmGKFQewWcOA" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m335.78268 1156.2074l131.68689 0l0 22.399902l-131.68689 0l0 -22.399902z" fill-rule="nonzero"/></a><path fill="#d9d9d9" d="m300.34647 1200.2257l202.36218 0l0 37.57483l-202.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m300.34647 1200.2257l202.36218 0l0 37.57483l-202.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m350.24847 1225.9331l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.677948 7.0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.677948 7.0l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm21.586517 7.0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm11.828827 5.765625l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457336 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485107 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#f6b26b" d="m442.48557 929.6273l148.85037 0l0 37.574768l-148.85037 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m442.48557 929.6273l148.85037 0l0 37.574768l-148.85037 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m459.8671 938.4457l114.08731 0l0 21.45288l-114.08731 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m463.78897 955.3347l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 3.703125l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.891327 4.78125l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm8.860107 3.703125l0 -1.1875l10.859375 0l0 1.1875l-10.859375 0zm11.891327 -3.703125l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.4531555 0 2.2187805 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.42190552 -0.265625 -0.9844055 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.853302 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.2038574 4.859375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.688232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.8912964 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953857 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m573.9544 938.4457l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m459.8671 956.54803l114.08731 0l0 1.6799927l-114.08731 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/vpn-manager/&sa=D&source=editors&ust=1638577908405000&usg=AOvVaw29nBVuUvKpGgtY8klmLoQL" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m459.8671 937.4147l114.08731 0l0 22.400024l-114.08731 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m21.83727 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m21.83727 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m31.00421 859.0225l117.19368 0l0 21.45288l-117.19368 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m30.97296 875.9115l5.124998 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.8749981 0zm3.859373 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.084198 5.484375l0 -13.359375l5.921875 0q1.78125 0 2.703125 0.359375q0.9375 0.359375 1.484375 1.28125q0.5625 0.90625 0.5625 2.015625q0 1.40625 -0.921875 2.390625q-0.921875 0.96875 -2.84375 1.234375q0.703125 0.34375 1.078125 0.671875q0.765625 0.703125 1.453125 1.765625l2.328125 3.640625l-2.21875 0l-1.765625 -2.78125q-0.78125 -1.203125 -1.28125 -1.828125q-0.5 -0.640625 -0.90625 -0.890625q-0.390625 -0.265625 -0.796875 -0.359375q-0.296875 -0.078125 -0.984375 -0.078125l-2.046875 0l0 5.9375l-1.765625 0zm1.765625 -7.453125l3.796875 0q1.21875 0 1.890625 -0.25q0.6875 -0.265625 1.046875 -0.8125q0.359375 -0.546875 0.359375 -1.1875q0 -0.953125 -0.6875 -1.5625q-0.6875 -0.609375 -2.1875 -0.609375l-4.21875 0l0 4.421875zm21.207325 2.765625l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.1562538 0 -3.5156288 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.2500038 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.5468788 0 -2.5781288 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.4843788 0 2.5156288 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm15.1875 4.6875l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.594467 3.640625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.917679 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203842 8.5625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203842 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051788 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m148.19789 859.0225l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m31.00421 877.1249l117.19368 0l0 1.6799927l-117.19368 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/arc_service.cc&sa=D&source=editors&ust=1638577908407000&usg=AOvVaw17_FBoPhwjcPMyT4rj__nw" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m31.00421 857.9915l117.19368 0l0 22.400024l-117.19368 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m179.4042 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.4042 846.50336l135.52756 0l0 44.97638l-135.52756 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m217.11119 848.0225l60.11357 0l0 21.45288l-60.11357 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m224.65807 861.3646l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.0 3.546875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.618927 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.641342 1.953125l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm12.671875 2.890625l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm6.640625 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m277.22476 848.0225l5.183319 0l0 21.45288l-5.183319 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m217.11119 866.1249l60.11357 0l0 1.6799927l-60.11357 0l0 -1.6799927z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m210.85753 870.0225l72.620895 0l0 21.45288l-72.620895 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m218.35753 886.9115l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.594467 3.640625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.917679 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203842 8.5625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4374847 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53123474 1.1875 -1.5468597 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.203842 3.59375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781952 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051941 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m283.47842 870.0225l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m210.85753 888.1249l72.620895 0l0 1.6799927l-72.620895 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/crostini_service.cc&sa=D&source=editors&ust=1638577908412000&usg=AOvVaw368D12PAiv9TC2m5vGYbiK" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m217.11119 846.9915l65.29689 0l0 22.400024l-65.29689 0l0 -22.400024z" fill-rule="nonzero"/></a><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/platform2/patchpanel/crostini_service.cc&sa=D&source=editors&ust=1638577908412000&usg=AOvVaw368D12PAiv9TC2m5vGYbiK" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m210.85753 868.9915l72.620895 0l0 22.400024l-72.620895 0l0 -22.400024z" fill-rule="nonzero"/></a><path fill="#f6b26b" d="m85.13386 932.13257l197.66931 0l0 79.1496l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m85.13386 932.13257l197.66931 0l0 79.1496l-197.66931 0z" fill-rule="evenodd"/><path fill="#000000" d="m143.72734 962.7557l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.844467 4.78125l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504196 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781967 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.9958038 1.46875l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.183304 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281967 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm23.697052 -1.578125l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm0.9851074 1.8125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m138.8765 964.1635l90.18404 0l0 21.45288l-90.18404 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m149.09525 981.05255l-2.390625 0l0 -1.421875q-0.59375 0.828125 -1.40625 1.234375q-0.796875 0.40625 -1.609375 0.40625q-1.671875 0 -2.859375 -1.34375q-1.1875 -1.34375 -1.1875 -3.75q0 -2.453125 1.15625 -3.734375q1.15625 -1.28125 2.921875 -1.28125q1.625 0 2.8125 1.34375l0 -4.8125l2.5625 0l0 13.359375zm-6.84375 -5.046875q0 1.546875 0.4375 2.234375q0.609375 1.015625 1.71875 1.015625q0.890625 0 1.5 -0.75q0.625 -0.765625 0.625 -2.25q0 -1.671875 -0.609375 -2.40625q-0.59375 -0.734375 -1.53125 -0.734375q-0.90625 0 -1.53125 0.734375q-0.609375 0.71875 -0.609375 2.15625zm18.161606 5.046875l-2.5625 0l0 -4.9375q0 -1.5625 -0.171875 -2.015625q-0.15625 -0.46875 -0.53125 -0.71875q-0.359375 -0.265625 -0.875 -0.265625q-0.671875 0 -1.203125 0.375q-0.53125 0.359375 -0.734375 0.96875q-0.1875 0.59375 -0.1875 2.21875l0 4.375l-2.546875 0l0 -9.671875l2.375 0l0 1.421875q1.265625 -1.640625 3.1875 -1.640625q0.84375 0 1.546875 0.3125q0.703125 0.296875 1.0625 0.78125q0.359375 0.46875 0.5 1.078125q0.140625 0.59375 0.140625 1.703125l0 6.015625zm1.6928558 -2.765625l2.5625 -0.390625q0.171875 0.75 0.671875 1.140625q0.5 0.390625 1.40625 0.390625q0.984375 0 1.484375 -0.375q0.34375 -0.25 0.34375 -0.671875q0 -0.296875 -0.1875 -0.484375q-0.1875 -0.1875 -0.859375 -0.34375q-3.09375 -0.6875 -3.921875 -1.25q-1.140625 -0.78125 -1.140625 -2.171875q0 -1.265625 0.984375 -2.109375q1.0 -0.859375 3.078125 -0.859375q1.984375 0 2.953125 0.65625q0.96875 0.640625 1.328125 1.90625l-2.40625 0.4375q-0.15625 -0.5625 -0.59375 -0.859375q-0.421875 -0.296875 -1.234375 -0.296875q-1.0 0 -1.4375 0.28125q-0.296875 0.203125 -0.296875 0.515625q0 0.265625 0.25 0.46875q0.34375 0.25 2.390625 0.71875q2.046875 0.453125 2.859375 1.140625q0.796875 0.671875 0.796875 1.890625q0 1.34375 -1.109375 2.296875q-1.109375 0.953125 -3.28125 0.953125q-1.984375 0 -3.140625 -0.796875q-1.140625 -0.8125 -1.5 -2.1875zm10.985092 -0.796875l0 -2.5625l5.03125 0l0 2.5625l-5.03125 0zm6.431427 -6.109375l2.390625 0l0 1.421875q0.46875 -0.734375 1.25 -1.1875q0.796875 -0.453125 1.765625 -0.453125q1.6875 0 2.859375 1.328125q1.171875 1.3125 1.171875 3.671875q0 2.421875 -1.1875 3.765625q-1.1875 1.34375 -2.859375 1.34375q-0.8125 0 -1.46875 -0.3125q-0.640625 -0.328125 -1.359375 -1.09375l0 4.875l-2.5625 0l0 -13.359375zm2.53125 4.671875q0 1.625 0.640625 2.40625q0.65625 0.78125 1.578125 0.78125q0.90625 0 1.484375 -0.71875q0.59375 -0.71875 0.59375 -2.34375q0 -1.515625 -0.609375 -2.25q-0.609375 -0.75 -1.515625 -0.75q-0.9375 0 -1.5625 0.734375q-0.609375 0.71875 -0.609375 2.140625zm11.395981 5.0l-2.5625 0l0 -9.671875l2.375 0l0 1.375q0.609375 -0.984375 1.09375 -1.28125q0.484375 -0.3125 1.109375 -0.3125q0.875 0 1.6875 0.484375l-0.796875 2.234375q-0.640625 -0.421875 -1.203125 -0.421875q-0.53125 0 -0.90625 0.296875q-0.375 0.296875 -0.59375 1.078125q-0.203125 0.765625 -0.203125 3.234375l0 2.984375zm4.213394 -4.96875q0 -1.28125 0.625 -2.46875q0.625 -1.203125 1.78125 -1.828125q1.15625 -0.625 2.578125 -0.625q2.1875 0 3.59375 1.421875q1.40625 1.421875 1.40625 3.609375q0 2.1875 -1.421875 3.640625q-1.421875 1.4375 -3.5625 1.4375q-1.328125 0 -2.546875 -0.59375q-1.203125 -0.609375 -1.828125 -1.765625q-0.625 -1.171875 -0.625 -2.828125zm2.625 0.125q0 1.453125 0.671875 2.21875q0.6875 0.75 1.6875 0.75q1.0 0 1.671875 -0.75q0.6875 -0.765625 0.6875 -2.234375q0 -1.421875 -0.6875 -2.1875q-0.671875 -0.765625 -1.671875 -0.765625q-1.0 0 -1.6875 0.765625q-0.671875 0.765625 -0.671875 2.203125zm8.130356 4.84375l3.484375 -4.984375l-3.34375 -4.6875l3.125 0l1.7187653 2.65625l1.796875 -2.65625l3.015625 0l-3.28125 4.578125l3.578125 5.09375l-3.140625 0l-1.96875 -3.0l-1.9843903 3.0l-3.0 0zm10.391342 -9.671875l2.71875 0l2.328125 6.859375l2.25 -6.859375l2.65625 0l-3.421875 9.3125l-0.609375 1.6875q-0.328125 0.84375 -0.640625 1.28125q-0.3125 0.453125 -0.703125 0.71875q-0.390625 0.28125 -0.96875 0.4375q-0.578125 0.15625 -1.3125 0.15625q-0.734375 0 -1.453125 -0.15625l-0.21875 -2.0q0.59375 0.125 1.078125 0.125q0.890625 0 1.3125 -0.53125q0.4375 -0.515625 0.671875 -1.328125l-3.6875 -9.703125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m229.06053 964.1635l0 0l0 21.45288l0 0l0 -21.45288z" fill-rule="nonzero"/><path fill="#000099" d="m138.8765 982.26587l90.18402 0l0 1.6799927l-90.18402 0l0 -1.6799927z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=http://cs/chromeos_public/src/platform2/dns-proxy/&sa=D&source=editors&ust=1638577908415000&usg=AOvVaw05VCZTJoPTgaCYwBYFBZj2" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m138.8765 963.13257l90.18402 0l0 22.399963l-90.18402 0l0 -22.399963z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1051.8176 88.39772l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1051.8176 88.39772l202.45667 0l0 59.685043l-202.45667 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1086.2451 112.75772l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.953125 6.015625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm8.9921875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.7109375 1.265625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm3.5859375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.71875 -6.703125l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0zm8.609375 0l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0z" fill-rule="nonzero"/><defs><linearGradient id="p.11" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.676676705825558 0.0 0.0 14.676676705825558 0.0 0.0)" spreadMethod="pad" x1="118.92581205697938" y1="33.811077392713536" x2="108.54792943839362" y2="23.433004764225224"><stop offset="0.0" stop-color="#4a4aff"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.11)" d="m1480.3806 456.65878l225.48022 0l0 79.14963l-225.48022 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1480.3806 456.65878l225.48022 0l0 79.14963l-225.48022 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1526.8021 466.3932l132.6372 0l0 15.32605l-132.6372 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1532.1615 478.4588l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm8.443726 4.125l-2.625 -6.90625l1.234375 0l1.484375 4.140625q0.234375 0.65625 0.4375 1.390625q0.15625 -0.546875 0.4375 -1.3125l1.53125 -4.21875l1.21875 0l-2.625 6.90625l-1.09375 0zm4.7578125 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.4611816 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.6468506 4.28125l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm5.656128 -0.15625l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5079346 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.7030029 -2.40625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.2093506 0q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm9.209351 2.40625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm6.5374756 0.15625l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm5.656006 -0.15625l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.9124756 4.125l0 -0.953125l4.390625 -5.046875q-0.75 0.03125 -1.3125 0.03125l-2.828125 0l0 -0.9375l5.65625 0l0 0.765625l-3.75 4.390625l-0.71875 0.796875q0.796875 -0.0625 1.484375 -0.0625l3.1875 0l0 1.015625l-6.109375 0z" fill-rule="nonzero"/><path fill="#000099" d="m1526.8021 479.32547l132.6372 0l0 1.1999817l-132.6372 0l0 -1.1999817z" fill-rule="nonzero"/><path fill="#ffffff" d="m1512.4567 497.0188l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm7.8046875 0l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm13.828125 4.703125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3671875 3.109375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm10.6953125 2.84375l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.453125 0l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.0859375 4.953125l0 -1.140625l5.28125 -6.0625q-0.890625 0.046875 -1.578125 0.046875l-3.390625 0l0 -1.140625l6.78125 0l0 0.921875l-4.484375 5.265625l-0.875 0.96875q0.953125 -0.078125 1.78125 -0.078125l3.828125 0l0 1.21875l-7.34375 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m1516.0231 516.0188l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm9.0703125 0l0 -11.453125l3.953125 0q1.328125 0 2.03125 0.15625q0.984375 0.234375 1.6875 0.828125q0.90625 0.765625 1.34375 1.953125q0.453125 1.1875 0.453125 2.71875q0 1.3125 -0.3125 2.328125q-0.296875 1.0 -0.78125 1.65625q-0.46875 0.65625 -1.03125 1.046875q-0.5625 0.375 -1.375 0.578125q-0.796875 0.1875 -1.828125 0.1875l-4.140625 0zm1.515625 -1.359375l2.453125 0q1.125 0 1.765625 -0.203125q0.65625 -0.21875 1.03125 -0.59375q0.546875 -0.546875 0.84375 -1.453125q0.296875 -0.90625 0.296875 -2.203125q0 -1.796875 -0.59375 -2.765625q-0.578125 -0.96875 -1.421875 -1.296875q-0.609375 -0.234375 -1.96875 -0.234375l-2.40625 0l0 8.75zm15.5390625 -1.3125l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.1328125 4.953125l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.703125 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm8.265625 0.375l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.9453125 4.953125l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.0859375 4.953125l0 -1.140625l5.28125 -6.0625q-0.890625 0.046875 -1.578125 0.046875l-3.390625 0l0 -1.140625l6.78125 0l0 0.921875l-4.484375 5.265625l-0.875 0.96875q0.953125 -0.078125 1.78125 -0.078125l3.828125 0l0 1.21875l-7.34375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:device/bluetooth/bluez&sa=D&source=editors&ust=1638577908425000&usg=AOvVaw1FheNV4kZMYC4PNgKTxSYP" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1526.8021 465.65878l132.6372 0l0 16.0l-132.6372 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1525.0105 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l125.64807 0c1.4019775 0 2.74646 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5482178 2.3358765 1.5482178 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286133 5.286194l-125.64807 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1525.0105 634.3768l0 0c0 -2.9194946 2.3666992 -5.286194 5.286255 -5.286194l125.64807 0c1.4019775 0 2.74646 0.55688477 3.737915 1.5482788c0.991333 0.991333 1.5482178 2.3358765 1.5482178 3.737915l0 21.144104c0 2.9194946 -2.3666992 5.286194 -5.286133 5.286194l-125.64807 0c-2.9195557 0 -5.286255 -2.3666992 -5.286255 -5.286194z" fill-rule="evenodd"/><path fill="#ffffff" d="m1574.6976 649.74884l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.9124756 4.125l0 -0.953125l4.390625 -5.046875q-0.75 0.03125 -1.3125 0.03125l-2.828125 0l0 -0.9375l5.65625 0l0 0.765625l-3.75 4.390625l-0.71875 0.796875q0.796875 -0.0625 1.484375 -0.0625l3.1875 0l0 1.015625l-6.109375 0zm7.6015625 0l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm2.921753 -7.796875l0.296875 -0.921875q1.03125 0.375 1.5 0.640625q-0.125 -1.1875 -0.125 -1.625l0.9375 0q-0.015625 0.640625 -0.140625 1.609375q0.65625 -0.328125 1.53125 -0.625l0.296875 0.921875q-0.828125 0.28125 -1.625 0.375q0.40625 0.34375 1.125 1.21875l-0.78125 0.5625q-0.375 -0.515625 -0.890625 -1.40625q-0.484375 0.921875 -0.84375 1.40625l-0.765625 -0.5625q0.75 -0.921875 1.078125 -1.21875q-0.84375 -0.171875 -1.59375 -0.375z" fill-rule="nonzero"/><defs><linearGradient id="p.12" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.004211477023244 0.0 0.0 14.004211477023244 0.0 0.0)" spreadMethod="pad" x1="123.80396466675418" y1="41.32674835506461" x2="113.9015840124829" y2="31.424183209047992"><stop offset="0.0" stop-color="#4a4aff"/><stop offset="0.5" stop-color="#6d9eeb"/><stop offset="0.51" stop-color="#9fc5e8"/><stop offset="1.0" stop-color="#9fc5e8"/></linearGradient></defs><path fill="url(#p.12)" d="m1478.9108 556.2598l232.37793 0l0 44.97638l-232.37793 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1478.9108 556.2598l232.37793 0l0 44.97638l-232.37793 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1489.8933 565.99426l129.67603 0l0 15.32605l-129.67603 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1495.2527 578.0598l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.365601 1.234375l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm8.443726 4.125l-2.625 -6.90625l1.234375 0l1.484375 4.140625q0.234375 0.65625 0.4375 1.390625q0.15625 -0.546875 0.4375 -1.3125l1.53125 -4.21875l1.21875 0l-2.625 6.90625l-1.09375 0zm4.7578125 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.4611816 -2.53125l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm6.8828125 0.3125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm5.6468506 4.28125l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm5.656006 -0.15625l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.7030029 -2.40625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.2093506 0q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm9.209351 2.40625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1403809 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm6.5374756 0.15625l2.765625 -9.859375l0.9375 0l-2.765625 9.859375l-0.9375 0zm9.062378 -0.15625l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm7.7093506 3.453125l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm10.865601 3.5l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" fill-rule="nonzero"/><path fill="#000000" d="m1624.3036 578.0598l0 -9.546875l3.28125 0q1.109375 0 1.703125 0.140625q0.8125 0.1875 1.390625 0.6875q0.765625 0.640625 1.140625 1.640625q0.375 0.984375 0.375 2.25q0 1.09375 -0.265625 1.9375q-0.25 0.828125 -0.65625 1.390625q-0.390625 0.546875 -0.859375 0.859375q-0.46875 0.3125 -1.140625 0.484375q-0.65625 0.15625 -1.53125 0.15625l-3.4375 0zm1.265625 -1.125l2.03125 0q0.9375 0 1.46875 -0.171875q0.546875 -0.1875 0.875 -0.5q0.4375 -0.453125 0.6875 -1.203125q0.25 -0.765625 0.25 -1.84375q0 -1.5 -0.5 -2.296875q-0.484375 -0.8125 -1.1875 -1.078125q-0.5 -0.203125 -1.625 -0.203125l-2.0 0l0 7.296875zm8.296997 1.125l0 -9.546875l3.59375 0q1.09375 0 1.75 0.296875q0.65625 0.28125 1.03125 0.890625q0.375 0.609375 0.375 1.265625q0 0.609375 -0.34375 1.15625q-0.328125 0.53125 -0.984375 0.859375q0.859375 0.25 1.328125 0.875q0.46875 0.609375 0.46875 1.4375q0 0.671875 -0.296875 1.25q-0.28125 0.578125 -0.703125 0.890625q-0.40625 0.3125 -1.03125 0.46875q-0.625 0.15625 -1.546875 0.15625l-3.640625 0zm1.265625 -5.53125l2.0625 0q0.84375 0 1.203125 -0.109375q0.484375 -0.140625 0.71875 -0.46875q0.25 -0.34375 0.25 -0.84375q0 -0.46875 -0.234375 -0.828125q-0.21875 -0.359375 -0.640625 -0.5q-0.421875 -0.140625 -1.453125 -0.140625l-1.90625 0l0 2.890625zm0 4.40625l2.375 0q0.609375 0 0.859375 -0.046875q0.4375 -0.078125 0.734375 -0.25q0.296875 -0.1875 0.484375 -0.53125q0.1875 -0.359375 0.1875 -0.8125q0 -0.53125 -0.28125 -0.921875q-0.265625 -0.40625 -0.75 -0.5625q-0.484375 -0.15625 -1.40625 -0.15625l-2.203125 0l0 3.28125zm12.0616455 1.125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.4124756 -2.0625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm17.78894 -1.28125l1.265625 0.3125q-0.390625 1.5625 -1.421875 2.375q-1.03125 0.8125 -2.53125 0.8125q-1.53125 0 -2.5 -0.625q-0.96875 -0.625 -1.484375 -1.8125q-0.5 -1.1875 -0.5 -2.5625q0 -1.484375 0.5625 -2.59375q0.578125 -1.109375 1.625 -1.6875q1.0625 -0.578125 2.328125 -0.578125q1.421875 0 2.390625 0.734375q0.984375 0.71875 1.375 2.046875l-1.25 0.296875q-0.328125 -1.046875 -0.96875 -1.515625q-0.625 -0.484375 -1.578125 -0.484375q-1.09375 0 -1.84375 0.53125q-0.734375 0.53125 -1.03125 1.421875q-0.296875 0.875 -0.296875 1.828125q0 1.21875 0.34375 2.125q0.359375 0.90625 1.109375 1.359375q0.75 0.4375 1.625 0.4375q1.0625 0 1.796875 -0.609375q0.734375 -0.609375 0.984375 -1.8125zm2.656372 3.34375l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm2.9924316 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm7.6798096 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5218506 4.125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.6717529 -1.015625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625z" fill-rule="nonzero"/><path fill="#000099" d="m1489.8933 578.9265l129.67603 0l0 1.2000122l-129.67603 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:device/bluetooth/dbus&sa=D&source=editors&ust=1638577908431000&usg=AOvVaw34LLFqKMJX0U3fwON_IxNW" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1489.8933 565.2598l129.67603 0l0 16.0l-129.67603 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#9fc5e8" d="m1445.042 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1445.042 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m1470.2968 325.41776l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm21.03125 -11.453125l1.515625 0l0 6.609375q0 1.734375 -0.390625 2.75q-0.390625 1.015625 -1.40625 1.65625q-1.015625 0.640625 -2.671875 0.640625q-1.609375 0 -2.640625 -0.5625q-1.015625 -0.5625 -1.453125 -1.609375q-0.4375 -1.046875 -0.4375 -2.875l0 -6.609375l1.515625 0l0 6.609375q0 1.484375 0.265625 2.203125q0.28125 0.703125 0.953125 1.09375q0.6875 0.375 1.65625 0.375q1.671875 0 2.375 -0.75q0.71875 -0.765625 0.71875 -2.921875l0 -6.609375zm4.3046875 11.453125l0 -11.453125l1.515625 0l0 11.453125l-1.515625 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1600.1207 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1600.1207 301.05774l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m1635.5981 325.41776l0 -11.453125l4.296875 0q1.3125 0 2.109375 0.34375q0.796875 0.34375 1.234375 1.078125q0.453125 0.71875 0.453125 1.5q0 0.734375 -0.40625 1.390625q-0.390625 0.640625 -1.1875 1.046875q1.03125 0.296875 1.59375 1.03125q0.5625 0.734375 0.5625 1.734375q0 0.8125 -0.34375 1.5q-0.34375 0.6875 -0.84375 1.0625q-0.5 0.375 -1.25 0.578125q-0.75 0.1875 -1.84375 0.1875l-4.375 0zm1.515625 -6.640625l2.484375 0q1.0 0 1.4375 -0.140625q0.578125 -0.171875 0.875 -0.5625q0.296875 -0.40625 0.296875 -1.0q0 -0.578125 -0.28125 -1.0q-0.265625 -0.4375 -0.78125 -0.59375q-0.5 -0.171875 -1.734375 -0.171875l-2.296875 0l0 3.46875zm0 5.28125l2.859375 0q0.734375 0 1.03125 -0.046875q0.515625 -0.09375 0.859375 -0.3125q0.359375 -0.21875 0.578125 -0.640625q0.234375 -0.421875 0.234375 -0.96875q0 -0.640625 -0.328125 -1.109375q-0.328125 -0.46875 -0.90625 -0.65625q-0.578125 -0.203125 -1.671875 -0.203125l-2.65625 0l0 3.9375zm9.015625 1.359375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.0234375 0l0 -1.21875q-0.96875 1.40625 -2.640625 1.40625q-0.734375 0 -1.375 -0.28125q-0.625 -0.28125 -0.9375 -0.703125q-0.3125 -0.4375 -0.4375 -1.046875q-0.078125 -0.421875 -0.078125 -1.3125l0 -5.140625l1.40625 0l0 4.59375q0 1.109375 0.078125 1.484375q0.140625 0.5625 0.5625 0.875q0.4375 0.3125 1.0625 0.3125q0.640625 0 1.1875 -0.3125q0.5625 -0.328125 0.78125 -0.890625q0.234375 -0.5625 0.234375 -1.625l0 -4.4375l1.40625 0l0 8.296875l-1.25 0zm9.1328125 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.4453125 0q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0z" fill-rule="nonzero"/><path fill="#000000" d="m1636.7192 341.74588l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm6.8984375 4.953125l3.03125 -4.3125l-2.8125 -3.984375l1.765625 0l1.265625 1.9375q0.359375 0.5625 0.578125 0.9375q0.34375 -0.515625 0.640625 -0.921875l1.390625 -1.953125l1.6875 0l-2.875 3.90625l3.09375 4.390625l-1.734375 0l-1.703125 -2.578125l-0.453125 -0.703125l-2.171875 3.28125l-1.703125 0zm12.0 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5625 -7.359375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm3.0234375 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm8.3359375 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#b6d7a8" d="m1557.0092 88.39895l202.45667 0l0 59.685036l-202.45667 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1557.0092 88.39895l202.45667 0l0 59.685036l-202.45667 0z" fill-rule="evenodd"/><path fill="#000000" d="m1573.3743 109.07145l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm10.484375 -0.46875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm8.3046875 4.15625l0 -7.203125l-1.234375 0l0 -1.09375l1.234375 0l0 -0.890625q0 -0.828125 0.15625 -1.234375q0.203125 -0.546875 0.703125 -0.890625q0.515625 -0.34375 1.4375 -0.34375q0.59375 0 1.3125 0.140625l-0.203125 1.234375q-0.4375 -0.078125 -0.828125 -0.078125q-0.640625 0 -0.90625 0.28125q-0.265625 0.265625 -0.265625 1.015625l0 0.765625l1.609375 0l0 1.09375l-1.609375 0l0 7.203125l-1.40625 0zm7.1796875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm15.4296875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5859375 4.171875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm8.2265625 -1.75l0 -1.59375l1.59375 0l0 1.59375l-1.59375 0zm0 6.703125l0 -1.609375l1.59375 0l0 1.609375l-1.59375 0zm16.84375 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9765625 4.15625l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm13.328125 0l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8203125 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 -6.796875l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm15.4375 -5.015625l-7.59375 3.25l0 -1.40625l6.015625 -2.484375l-6.015625 -2.46875l0 -1.40625l7.59375 3.203125l0 1.3125z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1597.3196 117.274574l121.83594 0l0 18.398445l-121.83594 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m1606.7258 127.743324l1.515625 0.37500763q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375076 -0.609375 -3.0781326q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625076q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.1718826zm2.6796875 -0.140625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.5937576 -0.484375 2.5156326q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.2343826zm1.453125 0q0 1.5937576 0.6875 2.3906326q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375076q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.1562576l0 -8.296883l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.3437576l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.1406326q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.3750076 0.765625 2.1093826q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.2812576l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm20.625 0.9375l1.515625 0.37500763q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375076 -0.609375 -3.0781326q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625076q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.1718826zm8.6171875 2.9843826q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.5156326 0.71875 -0.8125076q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.8750076q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.1406326q-0.765625 0.3125 -2.296875 0.5312576q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.5156326zm3.6015625 7.3593826l0 -11.484383l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.2812576 -0.46875 2.2968826q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.2968826q0 1.6093826 0.640625 2.3750076q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.4531326q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm13.0390625 3.0781326q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.5156326 0.71875 -0.8125076q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.8750076q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.1406326q-0.765625 0.3125 -2.296875 0.5312576q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.5156326zm4.8984375 4.1718826l-1.3125 0l0 -11.453133l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.1406326 -1.0625 3.3125076q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.2187576q0 1.5000076 0.40625 2.1562576q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.3906326q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.6171875 -5.625l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm3.5234375 0l0 -11.453133l1.40625 0l0 11.453133l-1.40625 0zm3.5859375 -9.843758l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.7656326l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.8437576q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 -8.578133l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.843758l0 -8.296883l1.40625 0l0 8.296883l-1.40625 0zm9.2265625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.1406326q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.3750076 0.765625 2.1093826q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.2812576l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.4687576l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.39063263 -2.15625 -0.6718826q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.7343826q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m1719.1555 117.274574l0 0l0 18.398445l0 0l0 -18.398445z" fill-rule="nonzero"/><path fill="#000099" d="m1597.3196 132.79895l121.83594 0l0 1.4400024l-121.83594 0l0 -1.4400024z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://moma.corp.google.com/team/1412950271243&sa=D&source=editors&ust=1638577908440000&usg=AOvVaw02UIGcrLQ6SEg9u4plFokz" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1597.3196 116.39895l121.83594 0l0 19.200005l-121.83594 0l0 -19.200005z" fill-rule="nonzero"/></a><path fill="#b6d7a8" d="m405.87665 349.05774l163.30707 0l0 131.18109l-163.30707 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m405.87665 349.05774l163.30707 0l0 131.18109l-163.30707 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m421.74112 358.93338l35.554688 0l0 18.398438l-35.554688 0l0 -18.398438z" fill-rule="nonzero"/><path fill="#000099" d="m422.44424 367.7615q0 -1.75 0.515625 -2.9375q0.390625 -0.875 1.0625 -1.5625q0.6875 -0.703125 1.484375 -1.046875q1.078125 -0.453125 2.46875 -0.453125q2.53125 0 4.046875 1.578125q1.53125 1.5625 1.53125 4.359375q0 2.78125 -1.515625 4.359375q-1.5 1.5625 -4.03125 1.5625q-2.546875 0 -4.0625 -1.5625q-1.5 -1.5625 -1.5 -4.296875zm2.375 -0.078125q0 1.9375 0.890625 2.953125q0.90625 1.0 2.296875 1.0q1.375 0 2.265625 -1.0q0.890625 -1.0 0.890625 -2.984375q0 -1.96875 -0.875 -2.9375q-0.859375 -0.96875 -2.28125 -0.96875q-1.4375 0 -2.3125 0.984375q-0.875 0.96875 -0.875 2.953125zm10.5546875 5.734375l0 -11.453125l2.25 0l4.6875 7.640625l0 -7.640625l2.15625 0l0 11.453125l-2.328125 0l-4.609375 -7.46875l0 7.46875l-2.15625 0zm18.867188 -4.21875l2.234375 0.71875q-0.515625 1.875 -1.71875 2.796875q-1.1875 0.90625 -3.03125 0.90625q-2.28125 0 -3.75 -1.5625q-1.46875 -1.5625 -1.46875 -4.265625q0 -2.859375 1.46875 -4.4375q1.484375 -1.59375 3.890625 -1.59375q2.09375 0 3.40625 1.25q0.78125 0.734375 1.171875 2.109375l-2.28125 0.546875q-0.203125 -0.890625 -0.859375 -1.40625q-0.640625 -0.515625 -1.5625 -0.515625q-1.265625 0 -2.0625 0.921875q-0.796875 0.90625 -0.796875 2.953125q0 2.171875 0.78125 3.09375q0.78125 0.921875 2.03125 0.921875q0.921875 0 1.578125 -0.578125q0.671875 -0.59375 0.96875 -1.859375z" fill-rule="nonzero"/><path fill="#000000" d="m462.913 373.41776l0 -11.453125l3.703125 0q2.109375 0 2.75 0.171875q0.984375 0.25 1.640625 1.125q0.671875 0.859375 0.671875 2.21875q0 1.0625 -0.390625 1.78125q-0.375 0.71875 -0.96875 1.125q-0.578125 0.40625 -1.1875 0.546875q-0.828125 0.15625 -2.40625 0.15625l-1.5 0l0 4.328125l-2.3125 0zm2.3125 -9.515625l0 3.25l1.265625 0q1.359375 0 1.8125 -0.171875q0.46875 -0.1875 0.734375 -0.5625q0.265625 -0.390625 0.265625 -0.90625q0 -0.625 -0.375 -1.03125q-0.359375 -0.40625 -0.921875 -0.5q-0.421875 -0.078125 -1.671875 -0.078125l-1.109375 0zm7.828125 5.25q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.53125 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203125 1.21875 1.203125 3.09375q0 1.875 -1.21875 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.03125 -0.515625 -1.578125 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.25 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm8.0390625 4.15625l0 -11.453125l2.1875 0l0 11.453125l-2.1875 0zm4.4453125 -9.421875l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm11.6796875 -5.84375l-2.171875 0.390625q-0.109375 -0.65625 -0.5 -0.984375q-0.375 -0.328125 -1.0 -0.328125q-0.8125 0 -1.3125 0.578125q-0.484375 0.5625 -0.484375 1.890625q0 1.46875 0.5 2.078125q0.5 0.609375 1.328125 0.609375q0.625 0 1.015625 -0.34375q0.40625 -0.359375 0.578125 -1.234375l2.15625 0.375q-0.34375 1.484375 -1.296875 2.25q-0.953125 0.75 -2.546875 0.75q-1.828125 0 -2.90625 -1.140625q-1.078125 -1.15625 -1.078125 -3.1875q0 -2.0625 1.078125 -3.203125q1.09375 -1.140625 2.9375 -1.140625q1.515625 0 2.40625 0.65625q0.90625 0.640625 1.296875 1.984375zm0.6171875 -2.453125l2.34375 0l1.984375 5.890625l1.9375 -5.890625l2.265625 0l-2.921875 7.984375l-0.53125 1.453125q-0.28125 0.71875 -0.546875 1.09375q-0.265625 0.390625 -0.609375 0.625q-0.328125 0.25 -0.828125 0.375q-0.5 0.140625 -1.125 0.140625q-0.625 0 -1.234375 -0.140625l-0.203125 -1.71875q0.515625 0.109375 0.9375 0.109375q0.765625 0 1.125 -0.453125q0.375 -0.453125 0.5625 -1.140625l-3.15625 -8.328125zm21.734406 4.078125l2.234375 0.71875q-0.515625 1.875 -1.71875 2.796875q-1.1875 0.90625 -3.03125 0.90625q-2.28125 0 -3.75 -1.5625q-1.46875 -1.5625 -1.46875 -4.265625q0 -2.859375 1.46875 -4.4375q1.484375 -1.59375 3.890625 -1.59375q2.09375 0 3.40625 1.25q0.78125 0.734375 1.171875 2.109375l-2.28125 0.546875q-0.203125 -0.890625 -0.859375 -1.40625q-0.640625 -0.515625 -1.5625 -0.515625q-1.265625 0 -2.0625 0.921875q-0.796875 0.90625 -0.796875 2.953125q0 2.171875 0.78125 3.09375q0.78125 0.921875 2.03125 0.921875q0.921875 0 1.578125 -0.578125q0.671875 -0.59375 0.96875 -1.859375zm3.6953125 -0.046875q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.53125 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203064 1.21875 1.203064 3.09375q0 1.875 -1.218689 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.03125 -0.515625 -1.578125 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.25 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm15.648376 4.15625l-2.046875 0l0 -1.21875q-0.5 0.703125 -1.203125 1.0625q-0.6875 0.34375 -1.390625 0.34375q-1.421875 0 -2.453125 -1.15625q-1.015625 -1.15625 -1.015625 -3.21875q0 -2.109375 0.984375 -3.203125q1.0 -1.09375 2.515625 -1.09375q1.390625 0 2.40625 1.15625l0 -4.125l2.203125 0l0 11.453125zm-5.859375 -4.328125q0 1.328125 0.359375 1.921875q0.53125 0.859375 1.484375 0.859375q0.765625 0 1.296875 -0.640625q0.53125 -0.65625 0.53125 -1.9375q0 -1.421875 -0.515625 -2.046875q-0.515625 -0.640625 -1.328125 -0.640625q-0.78125 0 -1.3125 0.625q-0.515625 0.625 -0.515625 1.859375zm12.8203125 1.6875l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0z" fill-rule="nonzero"/><path fill="#000099" d="m421.74112 374.45773l35.554688 0l0 1.4400024l-35.554688 0l0 -1.4400024z" fill-rule="nonzero"/><path fill="#000000" d="m430.95206 411.41776l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm8.453125 1.859375q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9453125 4.15625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9609375 -3.046875l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.59375 -6.796875l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm9.2265625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm18.414062 1.453125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6328125 7.296875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625305 0 1.8750305 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.8281555 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375305 0 1.6094055 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625305 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.601593 4.109375l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm9.2265625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.210876 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.82806396 -0.546875 -1.296814 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.249939 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm8.3203125 4.140625l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0z" fill-rule="nonzero"/><path fill="#000000" d="m441.07315 430.41776l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.109375 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.5703125 4.171875l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm8.9296875 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm13.3671875 3.109375q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm6.6640625 2.90625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm7.0546875 -1.40625l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm8.3203125 4.140625l0 -1.609375l1.609375 0l0 1.609375q0 0.890625 -0.3125 1.421875q-0.3125 0.546875 -1.0 0.84375l-0.390625 -0.59375q0.453125 -0.203125 0.65625 -0.578125q0.21875 -0.375 0.234375 -1.09375l-0.796875 0zm13.9375305 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.1094055 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.7187805 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.3750305 -0.1875q0.1875 -0.875 0.6094055 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.273376 0l0 -1.046875q-0.78125 1.234375 -2.312439 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59368896 0.3125 0.95306396 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.437439 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.562439 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65618896 -0.796875 -1.624939 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875z" fill-rule="nonzero"/><path fill="#000000" d="m453.90128 452.60526l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm13.0390625 3.078125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.0390625 1.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.0 0l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm14.234375 -0.1875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm13.2109375 4.953125l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm15.4687805 2.875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.7656555 0 -1.1875305 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.4062805 0l0 1.09375l-1.4062805 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.17190552 0.09375 0.48440552 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375z" fill-rule="nonzero"/><path fill="#000000" d="m429.6122 468.41776l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm17.070312 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm10.8984375 3.6875l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm2.9140625 1.265625l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm9.4921875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9609375 4.15625l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm5.34375 0l0 -11.453125l1.40625 0l0 6.53125l3.328125 -3.375l1.828125 0l-3.171875 3.078125l3.484375 5.21875l-1.734375 0l-2.734375 -4.25l-1.0 0.953125l0 3.296875l-1.40625 0zm8.21875 0l0 -11.453125l1.515625 0l0 4.703125l5.953125 0l0 -4.703125l1.515625 0l0 11.453125l-1.515625 0l0 -5.40625l-5.953125 0l0 5.40625l-1.515625 0zm16.742188 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.6406555 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.9062805 0 -1.5625305 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm14.273468 0l0 -1.046875q-0.78125 1.234375 -2.3125 1.234375q-1.0 0 -1.828125 -0.546875q-0.828125 -0.546875 -1.296875 -1.53125q-0.453125 -0.984375 -0.453125 -2.25q0 -1.25 0.40625 -2.25q0.421875 -1.015625 1.25 -1.546875q0.828125 -0.546875 1.859375 -0.546875q0.75 0 1.328125 0.3125q0.59375 0.3125 0.953125 0.828125l0 -4.109375l1.40625 0l0 11.453125l-1.3125 0zm-4.4375 -4.140625q0 1.59375 0.671875 2.390625q0.671875 0.78125 1.578125 0.78125q0.921875 0 1.5625 -0.75q0.65625 -0.765625 0.65625 -2.3125q0 -1.703125 -0.65625 -2.5q-0.65625 -0.796875 -1.625 -0.796875q-0.9375 0 -1.5625 0.765625q-0.625 0.765625 -0.625 2.421875zm7.9296875 4.140625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm9.257751 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359314 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.656189 0 2.703064 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.187439 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78118896 0 1.328064 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609314 -2.28125l4.624939 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734314 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8202515 4.953125l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8515625 0l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:components/onc/docs/onc_spec.md?q%3Donc_spec.md%26ss%3Dchromium&sa=D&source=editors&ust=1638577908448000&usg=AOvVaw2gP4DCQLjPpnEUVaYfcomF" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m421.74112 358.05774l35.554688 0l0 19.200012l-35.554688 0l0 -19.200012z" fill-rule="nonzero"/></a><path fill="#b6d7a8" d="m404.81628 492.5643l163.30707 0l0 54.141754l-163.30707 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m404.81628 492.5643l163.30707 0l0 54.141754l-163.30707 0z" fill-rule="evenodd"/><path fill="#000000" d="m423.3878 512.70557l2.234375 0.71875q-0.515625 1.875 -1.71875 2.796875q-1.1875 0.90625 -3.03125 0.90625q-2.28125 0 -3.75 -1.5625q-1.46875 -1.5625 -1.46875 -4.265625q0 -2.859375 1.46875 -4.4375q1.484375 -1.59375 3.890625 -1.59375q2.09375 0 3.40625 1.25q0.78125 0.734375 1.171875 2.109375l-2.28125 0.546875q-0.203125 -0.890625 -0.859375 -1.40625q-0.640625 -0.515625 -1.5625 -0.515625q-1.265625 0 -2.0625 0.921875q-0.796875 0.90625 -0.796875 2.953125q0 2.171875 0.78125 3.09375q0.78125 0.921875 2.03125 0.921875q0.921875 0 1.578125 -0.578125q0.671875 -0.59375 0.96875 -1.859375zm9.0078125 1.578125l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm6.0703125 4.859375l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625zm7.9296875 -8.296875l0 1.75l-1.5 0l0 3.34375q0 1.015625 0.046875 1.1875q0.046875 0.15625 0.1875 0.265625q0.15625 0.109375 0.375 0.109375q0.3125 0 0.890625 -0.203125l0.1875 1.703125q-0.765625 0.328125 -1.734375 0.328125q-0.59375 0 -1.078125 -0.203125q-0.46875 -0.203125 -0.703125 -0.515625q-0.21875 -0.3125 -0.296875 -0.859375q-0.078125 -0.375 -0.078125 -1.546875l0 -3.609375l-1.0 0l0 -1.75l1.0 0l0 -1.65625l2.203125 -1.28125l0 2.9375l1.5 0zm1.53125 -1.125l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm3.4765625 -8.296875l1.21875 0l0 -0.625q0 -1.046875 0.21875 -1.5625q0.234375 -0.515625 0.828125 -0.84375q0.59375 -0.328125 1.515625 -0.328125q0.9375 0 1.828125 0.28125l-0.296875 1.53125q-0.515625 -0.125 -1.0 -0.125q-0.484375 0 -0.6875 0.234375q-0.203125 0.21875 -0.203125 0.84375l0 0.59375l1.640625 0l0 1.71875l-1.640625 0l0 6.578125l-2.203125 0l0 -6.578125l-1.21875 0l0 -1.71875zm6.296875 -1.125l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm11.6796875 -5.84375l-2.171875 0.390625q-0.109375 -0.65625 -0.5 -0.984375q-0.375 -0.328125 -1.0 -0.328125q-0.8125 0 -1.3125 0.578125q-0.484375 0.5625 -0.484375 1.890625q0 1.46875 0.5 2.078125q0.5 0.609375 1.328125 0.609375q0.625 0 1.015625 -0.34375q0.40625 -0.359375 0.578125 -1.234375l2.15625 0.375q-0.34375 1.484375 -1.296875 2.25q-0.953125 0.75 -2.546875 0.75q-1.828125 0 -2.90625 -1.140625q-1.078125 -1.15625 -1.078125 -3.1875q0 -2.0625 1.078125 -3.203125q1.09375 -1.140625 2.9375 -1.140625q1.515625 0 2.40625 0.65625q0.90625 0.640625 1.296875 1.984375zm3.3046875 0.078125l-2.0 -0.359375q0.34375 -1.203125 1.15625 -1.78125q0.828125 -0.578125 2.4375 -0.578125q1.46875 0 2.1875 0.34375q0.71875 0.34375 1.015625 0.890625q0.296875 0.53125 0.296875 1.953125l-0.03125 2.5625q0 1.09375 0.109375 1.625q0.109375 0.515625 0.390625 1.109375l-2.171875 0q-0.078125 -0.21875 -0.203125 -0.65625q-0.0625 -0.1875 -0.078125 -0.25q-0.5625 0.546875 -1.203125 0.828125q-0.640625 0.265625 -1.375 0.265625q-1.28125 0 -2.015625 -0.6875q-0.734375 -0.703125 -0.734375 -1.765625q0 -0.703125 0.328125 -1.25q0.34375 -0.5625 0.9375 -0.84375q0.609375 -0.296875 1.75 -0.515625q1.546875 -0.296875 2.140625 -0.546875l0 -0.21875q0 -0.625 -0.3125 -0.890625q-0.3125 -0.28125 -1.1875 -0.28125q-0.578125 0 -0.90625 0.234375q-0.328125 0.234375 -0.53125 0.8125zm2.9375 1.78125q-0.421875 0.140625 -1.34375 0.34375q-0.90625 0.1875 -1.1875 0.375q-0.4375 0.296875 -0.4375 0.765625q0 0.46875 0.34375 0.8125q0.34375 0.328125 0.875 0.328125q0.59375 0 1.140625 -0.390625q0.390625 -0.296875 0.515625 -0.734375q0.09375 -0.28125 0.09375 -1.0625l0 -0.4375zm8.1171875 -4.3125l0 1.75l-1.5 0l0 3.34375q0 1.015625 0.046875 1.1875q0.046875 0.15625 0.1875 0.265625q0.15625 0.109375 0.375 0.109375q0.3125 0 0.890625 -0.203125l0.1875 1.703125q-0.765625 0.328125 -1.734375 0.328125q-0.59375 0 -1.078125 -0.203125q-0.46875 -0.203125 -0.703125 -0.515625q-0.21875 -0.3125 -0.296875 -0.859375q-0.078125 -0.375 -0.078125 -1.546875l0 -3.609375l-1.0 0l0 -1.75l1.0 0l0 -1.65625l2.203125 -1.28125l0 2.9375l1.5 0zm6.328125 5.65625l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm3.9921875 4.859375l0 -11.453125l3.703125 0q2.109375 0 2.75 0.171875q0.984375 0.25 1.640625 1.125q0.671875 0.859375 0.671875 2.21875q0 1.0625 -0.390625 1.78125q-0.375 0.71875 -0.96875 1.125q-0.578125 0.40625 -1.1875 0.546875q-0.828125 0.15625 -2.40625 0.15625l-1.5 0l0 4.328125l-2.3125 0zm2.3125 -9.515625l0 3.25l1.265625 0q1.359375 0 1.8125 -0.171875q0.46875 -0.1875 0.734375 -0.5625q0.265625 -0.390625 0.265625 -0.90625q0 -0.625 -0.375 -1.03125q-0.359375 -0.40625 -0.921875 -0.5q-0.421875 -0.078125 -1.671875 -0.078125l-1.109375 0zm10.4375 9.515625l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625zm3.6171875 -4.265625q0 -1.09375 0.53125 -2.109375q0.546875 -1.03125 1.5312195 -1.5625q1.0 -0.546875 2.21875 -0.546875q1.875 0 3.078125 1.21875q1.203125 1.21875 1.203125 3.09375q0 1.875 -1.21875 3.125q-1.203125 1.234375 -3.046875 1.234375q-1.140625 0 -2.1875 -0.515625q-1.0312195 -0.515625 -1.5780945 -1.515625q-0.53125 -1.0 -0.53125 -2.421875zm2.2499695 0.109375q0 1.234375 0.578125 1.890625q0.59375 0.65625 1.453125 0.65625q0.859375 0 1.4375 -0.65625q0.59375 -0.65625 0.59375 -1.90625q0 -1.21875 -0.59375 -1.875q-0.578125 -0.65625 -1.4375 -0.65625q-0.859375 0 -1.453125 0.65625q-0.578125 0.65625 -0.578125 1.890625zm10.3203125 4.15625l-3.34375 -8.296875l2.296875 0l1.5625 4.234375l0.453125 1.40625q0.1875 -0.53125 0.234375 -0.703125q0.109375 -0.359375 0.234375 -0.703125l1.578125 -4.234375l2.25 0l-3.296875 8.296875l-1.96875 0zm6.6171875 -9.421875l0 -2.03125l2.1875 0l0 2.03125l-2.1875 0zm0 9.421875l0 -8.296875l2.1875 0l0 8.296875l-2.1875 0zm12.0546875 0l-2.046875 0l0 -1.21875q-0.5 0.703125 -1.203125 1.0625q-0.6875 0.34375 -1.390625 0.34375q-1.421875 0 -2.453125 -1.15625q-1.015625 -1.15625 -1.015625 -3.21875q0 -2.109375 0.984375 -3.203125q1.0 -1.09375 2.515625 -1.09375q1.390625 0 2.40625 1.15625l0 -4.125l2.203125 0l0 11.453125zm-5.859375 -4.328125q0 1.328125 0.359375 1.921875q0.53125 0.859375 1.484375 0.859375q0.765625 0 1.296875 -0.640625q0.53125 -0.65625 0.53125 -1.9375q0 -1.421875 -0.515625 -2.046875q-0.515625 -0.640625 -1.328125 -0.640625q-0.78125 0 -1.3125 0.625q-0.515625 0.625 -0.515625 1.859375zm12.8203125 1.6875l2.1875 0.359375q-0.421875 1.203125 -1.328125 1.84375q-0.90625 0.625 -2.28125 0.625q-2.15625 0 -3.203125 -1.421875q-0.8125 -1.125 -0.8125 -2.859375q0 -2.0625 1.078125 -3.21875q1.078125 -1.171875 2.71875 -1.171875q1.859375 0 2.921875 1.21875q1.078125 1.21875 1.03125 3.75l-5.5 0q0.015625 0.96875 0.515625 1.515625q0.515625 0.546875 1.28125 0.546875q0.515625 0 0.859375 -0.28125q0.359375 -0.28125 0.53125 -0.90625zm0.125 -2.21875q-0.015625 -0.953125 -0.484375 -1.453125q-0.46875 -0.5 -1.140625 -0.5q-0.71875 0 -1.1875 0.53125q-0.46875 0.515625 -0.46875 1.421875l3.28125 0zm6.0703125 4.859375l-2.1875 0l0 -8.296875l2.03125 0l0 1.171875q0.53125 -0.828125 0.9375 -1.09375q0.421875 -0.265625 0.953125 -0.265625q0.75 0 1.453125 0.40625l-0.6875 1.921875q-0.546875 -0.359375 -1.03125 -0.359375q-0.453125 0 -0.78125 0.25q-0.3125 0.25 -0.5 0.921875q-0.1875 0.65625 -0.1875 2.78125l0 2.5625z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1472.627 404.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1472.627 404.8479l0 0c0 -3.4587402 2.803955 -6.2626038 6.2626953 -6.2626038l219.85266 0c1.6610107 0 3.2539062 0.65982056 4.4283447 1.8342896c1.1744385 1.1744385 1.8343506 2.7673645 1.8343506 4.428314l0 25.049622c0 3.4587097 -2.803955 6.2625732 -6.2626953 6.2625732l-219.85266 0c-3.4587402 0 -6.2626953 -2.8038635 -6.2626953 -6.2625732z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1486.9481 410.15396l203.73572 0l0 15.32605l-203.73572 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1492.3387 419.6883l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm2.1484375 2.53125l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm7.3968506 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.0164795 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm15.836792 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.0843506 0.671875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.1781006 1.390625l1.15625 -0.1875q0.109375 0.703125 0.546875 1.078125q0.453125 0.359375 1.25 0.359375q0.8125 0 1.203125 -0.328125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.359375 -0.625q-0.234375 -0.15625 -1.1875 -0.390625q-1.296875 -0.328125 -1.796875 -0.5625q-0.484375 -0.25 -0.75 -0.65625q-0.25 -0.421875 -0.25 -0.9375q0 -0.453125 0.203125 -0.84375q0.21875 -0.40625 0.578125 -0.671875q0.28125 -0.1875 0.75 -0.328125q0.46875 -0.140625 1.015625 -0.140625q0.8125 0 1.421875 0.234375q0.609375 0.234375 0.90625 0.640625q0.296875 0.390625 0.40625 1.0625l-1.140625 0.15625q-0.078125 -0.53125 -0.453125 -0.828125q-0.375 -0.3125 -1.0625 -0.3125q-0.8125 0 -1.15625 0.265625q-0.34375 0.265625 -0.34375 0.625q0 0.234375 0.140625 0.421875q0.15625 0.1875 0.453125 0.3125q0.171875 0.0625 1.03125 0.296875q1.25 0.328125 1.734375 0.546875q0.5 0.203125 0.78125 0.609375q0.28125 0.40625 0.28125 1.0q0 0.59375 -0.34375 1.109375q-0.34375 0.515625 -1.0 0.796875q-0.640625 0.28125 -1.453125 0.28125q-1.34375 0 -2.046875 -0.5625q-0.703125 -0.5625 -0.90625 -1.65625zm7.4609375 2.0625l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm4.453003 0l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.3187256 3.5l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm7.5080566 0l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm7.6156006 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm9.084351 3.078125l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm0.70288086 -2.40625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.2093506 0q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm9.209351 2.40625l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm6.3343506 2.65625l0 -0.859375l7.765625 0l0 0.859375l-7.765625 0zm13.006226 -5.1875l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm7.6937256 0l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm3.437378 -8.1875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.7266846 0.578125l1.140625 0.15625q0.078125 0.53125 0.40625 0.78125q0.4375 0.3125 1.1875 0.3125q0.8125 0 1.25 -0.328125q0.453125 -0.3125 0.609375 -0.90625q0.09375 -0.359375 0.078125 -1.5q-0.765625 0.90625 -1.90625 0.90625q-1.4375 0 -2.21875 -1.03125q-0.78125 -1.03125 -0.78125 -2.46875q0 -0.984375 0.359375 -1.8125q0.359375 -0.84375 1.03125 -1.296875q0.6875 -0.453125 1.609375 -0.453125q1.21875 0 2.015625 0.984375l0 -0.828125l1.078125 0l0 5.96875q0 1.609375 -0.328125 2.28125q-0.328125 0.6875 -1.046875 1.078125q-0.703125 0.390625 -1.75 0.390625q-1.234375 0 -2.0 -0.5625q-0.75 -0.5625 -0.734375 -1.671875zm0.984375 -4.15625q0 1.359375 0.53125 1.984375q0.546875 0.625 1.359375 0.625q0.796875 0 1.34375 -0.625q0.546875 -0.625 0.546875 -1.953125q0 -1.265625 -0.5625 -1.90625q-0.5625 -0.640625 -1.359375 -0.640625q-0.765625 0 -1.3125 0.640625q-0.546875 0.625 -0.546875 1.875zm6.9749756 3.578125l0 -1.328125l1.34375 0l0 1.328125l-1.34375 0zm3.374878 0l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0zm10.664917 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm-1.484375 10.875l0.21875 -1.0q0.359375 0.09375 0.546875 0.09375q0.359375 0 0.53125 -0.25q0.1875 -0.234375 0.1875 -1.1875l0 -7.25l1.171875 0l0 7.28125q0 1.28125 -0.328125 1.78125q-0.4375 0.65625 -1.40625 0.65625q-0.484375 0 -0.921875 -0.125zm4.0080566 -6.140625q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.046875 0l0 0.96875q0.328125 -0.515625 0.859375 -0.8125q0.546875 -0.3125 1.234375 -0.3125q0.78125 0 1.265625 0.3125q0.484375 0.3125 0.6875 0.890625q0.828125 -1.203125 2.140625 -1.203125q1.03125 0 1.578125 0.578125q0.5625 0.5625 0.5625 1.734375l0 4.75l-1.171875 0l0 -4.359375q0 -0.703125 -0.125 -1.0q-0.109375 -0.3125 -0.40625 -0.5q-0.296875 -0.1875 -0.703125 -0.1875q-0.71875 0 -1.203125 0.484375q-0.484375 0.484375 -0.484375 1.546875l0 4.015625l-1.171875 0l0 -4.484375q0 -0.78125 -0.296875 -1.171875q-0.28125 -0.390625 -0.921875 -0.390625q-0.5 0 -0.921875 0.265625q-0.421875 0.25 -0.609375 0.75q-0.1875 0.5 -0.1875 1.453125l0 3.578125l-1.171875 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1690.6838 410.15396l0 0l0 15.32605l0 0l0 -15.32605z" fill-rule="nonzero"/><path fill="#000099" d="m1486.9481 423.0862l203.73572 0l0 1.2000122l-203.73572 0l0 -1.2000122z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.chromium.org/chromium/chromium/src/%2B/master:chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom;drc%3Df9be5b6a5e75d03f58a9c62fd3649fc7801b2a2e&sa=D&source=editors&ust=1638577908456000&usg=AOvVaw3uOJWnLrnW4k6VWbEkyM_B" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1486.9481 409.41956l203.73572 0l0 16.0l-203.73572 0l0 -16.0z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1456.1392 674.9134l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1456.1392 674.9134l322.07874 0l0 347.65356l-322.07874 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m1585.1746 685.2268l64.00781 0l0 27.597656l-64.00781 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#ffffff" d="m1586.9402 689.76587l6.859375 0q2.046875 0 3.046875 0.171875q1.0 0.171875 1.78125 0.71875q0.796875 0.53125 1.328125 1.4375q0.53125 0.890625 0.53125 2.0q0 1.203125 -0.65625 2.21875q-0.65625 1.0 -1.765625 1.515625q1.578125 0.453125 2.421875 1.5625q0.84375 1.09375 0.84375 2.578125q0 1.171875 -0.546875 2.28125q-0.546875 1.109375 -1.5 1.78125q-0.9375 0.65625 -2.3125 0.796875q-0.875 0.09375 -4.1875 0.125l-5.84375 0l0 -17.1875zm3.46875 2.859375l0 3.984375l2.265625 0q2.03125 0 2.515625 -0.0625q0.890625 -0.109375 1.40625 -0.609375q0.515625 -0.515625 0.515625 -1.34375q0 -0.796875 -0.453125 -1.296875q-0.4375 -0.5 -1.296875 -0.609375q-0.515625 -0.0625 -2.96875 -0.0625l-1.984375 0zm0 6.84375l0 4.59375l3.203125 0q1.875 0 2.375 -0.109375q0.78125 -0.140625 1.265625 -0.6875q0.484375 -0.546875 0.484375 -1.453125q0 -0.78125 -0.375 -1.3125q-0.375 -0.546875 -1.09375 -0.78125q-0.703125 -0.25 -3.0625 -0.25l-2.796875 0zm13.816406 7.484375l0 -17.1875l3.296875 0l0 17.1875l-3.296875 0zm14.871094 0l0 -1.859375q-0.6875 0.984375 -1.796875 1.5625q-1.109375 0.578125 -2.328125 0.578125q-1.265625 0 -2.265625 -0.546875q-0.984375 -0.5625 -1.4375 -1.546875q-0.4375 -1.0 -0.4375 -2.765625l0 -7.875l3.296875 0l0 5.71875q0 2.625 0.171875 3.21875q0.1875 0.59375 0.65625 0.9375q0.484375 0.34375 1.234375 0.34375q0.84375 0 1.5 -0.453125q0.671875 -0.46875 0.921875 -1.15625q0.25 -0.6875 0.25 -3.359375l0 -5.25l3.28125 0l0 12.453125l-3.046875 0zm13.675781 -3.96875l3.28125 0.5625q-0.640625 1.796875 -2.015625 2.75q-1.359375 0.9375 -3.40625 0.9375q-3.25 0 -4.796875 -2.125q-1.234375 -1.703125 -1.234375 -4.28125q0 -3.09375 1.609375 -4.84375q1.625 -1.765625 4.09375 -1.765625q2.78125 0 4.375 1.84375q1.609375 1.828125 1.546875 5.609375l-8.25 0q0.03125 1.46875 0.796875 2.28125q0.765625 0.8125 1.890625 0.8125q0.78125 0 1.296875 -0.421875q0.53125 -0.421875 0.8125 -1.359375zm0.1875 -3.328125q-0.046875 -1.421875 -0.75 -2.15625q-0.703125 -0.75 -1.703125 -0.75q-1.078125 0 -1.78125 0.78125q-0.703125 0.78125 -0.6875 2.125l4.921875 0zm4.6289062 7.296875l0 -2.5625l4.65625 -5.359375q1.15625 -1.3125 1.703125 -1.859375q-0.578125 0.03125 -1.515625 0.046875l-4.390625 0.015625l0 -2.734375l10.28125 0l0 2.34375l-4.75 5.484375l-1.671875 1.8125q1.359375 -0.078125 1.6875 -0.078125l5.109375 0l0 2.890625l-11.109375 0z" fill-rule="nonzero"/><path fill="#010000" fill-opacity="0.0" d="m1649.1824 685.2268l0 0l0 27.597656l0 0l0 -27.597656z" fill-rule="nonzero"/><path fill="#ffffff" d="m1585.1746 708.51337l64.00781 0l0 2.1600342l-64.00781 0l0 -2.1600342z" fill-rule="nonzero"/><a xlink:href="https://www.google.com/url?q=https://source.corp.google.com/chromeos_public/src/third_party/bluez/&sa=D&source=editors&ust=1638577908458000&usg=AOvVaw2XcANOYvAC_PQRsMRV31ge" target="_blank" rel="noreferrer"><path fill="transparent" fill-opacity="0" d="m1585.1746 683.9134l64.00781 0l0 28.799988l-64.00781 0l0 -28.799988z" fill-rule="nonzero"/></a><path fill="#4a4aff" d="m1533.8398 1140.8188l197.66931 0l0 54.141724l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1533.8398 1140.8188l197.66931 0l0 54.141724l-197.66931 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1579.967 1167.7389l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.37072754 1.703125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0zm7.9177246 -0.234375l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.844482 4.90625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519775 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm10.672607 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9958496 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.68811 0q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm12.875732 3.375l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6052246 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#4a4aff" d="m1493.042 1291.8818l295.11816 0l0 79.14966l-295.11816 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1493.042 1291.8818l295.11816 0l0 79.14966l-295.11816 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1630.0406 1318.8019l0 -13.359375l5.015625 0q1.53125 0 2.453125 0.40625q0.921875 0.40625 1.4375 1.25q0.53125 0.84375 0.53125 1.765625q0 0.859375 -0.46875 1.625q-0.453125 0.75 -1.390625 1.203125q1.203125 0.359375 1.859375 1.21875q0.65625 0.859375 0.65625 2.015625q0 0.9375 -0.40625 1.75q-0.390625 0.796875 -0.984375 1.234375q-0.578125 0.4375 -1.453125 0.671875q-0.875 0.21875 -2.15625 0.21875l-5.09375 0zm1.78125 -7.75l2.875 0q1.1875 0 1.6875 -0.140625q0.671875 -0.203125 1.015625 -0.671875q0.34375 -0.46875 0.34375 -1.171875q0 -0.65625 -0.328125 -1.15625q-0.3125 -0.515625 -0.90625 -0.703125q-0.59375 -0.1875 -2.03125 -0.1875l-2.65625 0l0 4.03125zm0 6.171875l3.3125 0q0.859375 0 1.203125 -0.0625q0.609375 -0.109375 1.015625 -0.359375q0.421875 -0.265625 0.6875 -0.75q0.265625 -0.484375 0.265625 -1.125q0 -0.75 -0.390625 -1.296875q-0.375 -0.546875 -1.0625 -0.765625q-0.671875 -0.234375 -1.953125 -0.234375l-3.078125 0l0 4.59375zm14.1467285 1.578125l0 -11.78125l-4.40625 0l0 -1.578125l10.578125 0l0 1.578125l-4.40625 0l0 11.78125l-1.765625 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m1556.8534 1344.7238q-1.359375 -1.703125 -2.296875 -4.0q-0.9375 -2.296875 -0.9375 -4.765625q0 -2.15625 0.703125 -4.140625q0.828125 -2.3125 2.53125 -4.59375l1.171875 0q-1.09375 1.890625 -1.453125 2.703125q-0.546875 1.25 -0.875 2.625q-0.390625 1.703125 -0.390625 3.421875q0 4.375 2.71875 8.75l-1.171875 0zm12.8220215 -8.609375l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.1291504 -0.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953857 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5895996 1.46875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.6188965 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.250732 4.84375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1447754 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.816772 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm11.708374 0l0 -13.359375l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.0625l-1.765625 0zm11.099121 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1292725 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm17.322021 0l-2.96875 -9.671875l1.703125 0l1.53125 5.578125l0.578125 2.078125q0.046875 -0.15625 0.5 -2.0l1.546875 -5.65625l1.6875 0l1.4375 5.609375l0.484375 1.84375l0.5625 -1.859375l1.65625 -5.59375l1.59375 0l-3.03125 9.671875l-1.703125 0l-1.53125 -5.796875l-0.375 -1.640625l-1.953125 7.4375l-1.71875 0zm18.004272 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881104 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853394 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm10.219482 9.6875l-1.1875 0q2.734375 -4.375 2.734375 -8.75q0 -1.71875 -0.390625 -3.390625q-0.3125 -1.375 -0.875 -2.625q-0.359375 -0.828125 -1.46875 -2.734375l1.1875 0q1.703125 2.28125 2.53125 4.59375q0.6875 1.984375 0.6875 4.140625q0 2.46875 -0.9375 4.765625q-0.9375 2.296875 -2.28125 4.0z" fill-rule="nonzero"/><path fill="#4a4aff" d="m1472.1392 754.09186l287.3385 0l0 247.62207l-287.3385 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1472.1392 754.09186l287.3385 0l0 247.62207l-287.3385 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1563.2888 786.13184l-1.953125 0l0 -17.1875l2.109375 0l0 6.140625q1.328125 -1.6875 3.40625 -1.6875q1.140625 0 2.171875 0.46875q1.03125 0.46875 1.6875 1.3125q0.65625 0.828125 1.03125 2.015625q0.375 1.171875 0.375 2.53125q0 3.1875 -1.578125 4.9375q-1.578125 1.75 -3.796875 1.75q-2.203125 0 -3.453125 -1.84375l0 1.5625zm-0.03125 -6.3125q0 2.234375 0.609375 3.234375q1.0 1.625 2.703125 1.625q1.375 0 2.375 -1.203125q1.015625 -1.203125 1.015625 -3.578125q0 -2.4375 -0.96875 -3.59375q-0.953125 -1.171875 -2.328125 -1.171875q-1.390625 0 -2.40625 1.203125q-1.0 1.203125 -1.0 3.484375zm11.378906 6.3125l0 -17.1875l2.109375 0l0 17.1875l-2.109375 0zm13.535156 0l0 -1.828125q-1.453125 2.109375 -3.9375 2.109375q-1.109375 0 -2.0625 -0.421875q-0.953125 -0.421875 -1.421875 -1.0625q-0.453125 -0.640625 -0.640625 -1.5625q-0.140625 -0.625 -0.140625 -1.96875l0 -7.71875l2.109375 0l0 6.90625q0 1.65625 0.140625 2.234375q0.1875 0.828125 0.828125 1.3125q0.65625 0.46875 1.609375 0.46875q0.9375 0 1.765625 -0.484375q0.84375 -0.5 1.1875 -1.328125q0.34375 -0.84375 0.34375 -2.4375l0 -6.671875l2.109375 0l0 12.453125l-1.890625 0zm13.722656 -4.015625l2.171875 0.28125q-0.515625 1.90625 -1.90625 2.96875q-1.390625 1.046875 -3.5625 1.046875q-2.734375 0 -4.34375 -1.671875q-1.59375 -1.6875 -1.59375 -4.734375q0 -3.140625 1.609375 -4.875q1.625 -1.734375 4.203125 -1.734375q2.5 0 4.078125 1.703125q1.59375 1.703125 1.59375 4.78125q0 0.1875 -0.015625 0.5625l-9.28125 0q0.109375 2.046875 1.15625 3.140625q1.046875 1.09375 2.609375 1.09375q1.15625 0 1.96875 -0.609375q0.828125 -0.609375 1.3125 -1.953125zm-6.9375 -3.40625l6.953125 0q-0.140625 -1.5625 -0.796875 -2.359375q-1.0 -1.21875 -2.609375 -1.21875q-1.453125 0 -2.453125 0.984375q-0.984375 0.96875 -1.09375 2.59375zm16.363281 5.53125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm1.2773438 -4.328125q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm11.175781 0q0 -3.46875 1.921875 -5.125q1.609375 -1.390625 3.921875 -1.390625q2.5625 0 4.1875 1.6875q1.625 1.6875 1.625 4.640625q0 2.40625 -0.71875 3.78125q-0.71875 1.375 -2.09375 2.140625q-1.375 0.765625 -3.0 0.765625q-2.625 0 -4.234375 -1.671875q-1.609375 -1.6875 -1.609375 -4.828125zm2.171875 0q0 2.390625 1.03125 3.578125q1.046875 1.1875 2.640625 1.1875q1.5625 0 2.609375 -1.1875q1.046875 -1.203125 1.046875 -3.65625q0 -2.3125 -1.0625 -3.5q-1.046875 -1.1875 -2.59375 -1.1875q-1.59375 0 -2.640625 1.1875q-1.03125 1.1875 -1.03125 3.578125zm16.566406 4.328125l0.3125 1.859375q-0.890625 0.203125 -1.59375 0.203125q-1.15625 0 -1.796875 -0.359375q-0.625 -0.375 -0.890625 -0.96875q-0.25 -0.59375 -0.25 -2.484375l0 -7.171875l-1.546875 0l0 -1.640625l1.546875 0l0 -3.078125l2.09375 -1.265625l0 4.34375l2.125 0l0 1.640625l-2.125 0l0 7.28125q0 0.90625 0.109375 1.171875q0.125 0.25 0.375 0.40625q0.25 0.140625 0.71875 0.140625q0.34375 0 0.921875 -0.078125zm2.0585938 1.890625l0 -17.1875l2.109375 0l0 6.171875q1.484375 -1.71875 3.734375 -1.71875q1.375 0 2.390625 0.546875q1.03125 0.546875 1.46875 1.515625q0.4375 0.953125 0.4375 2.78125l0 7.890625l-2.109375 0l0 -7.890625q0 -1.578125 -0.6875 -2.296875q-0.6875 -0.71875 -1.9375 -0.71875q-0.9375 0 -1.765625 0.484375q-0.828125 0.484375 -1.1875 1.3125q-0.34375 0.828125 -0.34375 2.296875l0 6.8125l-2.109375 0zm21.425781 0l0 -1.578125q-1.1875 1.859375 -3.484375 1.859375q-1.484375 0 -2.734375 -0.8125q-1.25 -0.828125 -1.9375 -2.296875q-0.671875 -1.46875 -0.671875 -3.390625q0 -1.859375 0.609375 -3.375q0.625 -1.515625 1.859375 -2.328125q1.25 -0.8125 2.78125 -0.8125q1.125 0 2.0 0.484375q0.890625 0.46875 1.4375 1.234375l0 -6.171875l2.09375 0l0 17.1875l-1.953125 0zm-6.671875 -6.21875q0 2.390625 1.0 3.578125q1.015625 1.1875 2.390625 1.1875q1.390625 0 2.34375 -1.125q0.96875 -1.140625 0.96875 -3.453125q0 -2.5625 -0.984375 -3.75q-0.984375 -1.203125 -2.421875 -1.203125q-1.40625 0 -2.359375 1.15625q-0.9375 1.140625 -0.9375 3.609375z" fill-rule="nonzero"/><path fill="#d9d9d9" d="m1665.2179 1067.0526l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286255 -5.286255l-117.837036 0c-1.4019775 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.991333 0.991333 -1.5483398 2.3359375 -1.5483398 3.737915l0 21.144165c0 2.9194336 2.3666992 5.286133 5.286255 5.286133l117.837036 0c2.9195557 0 5.286255 -2.3666992 5.286255 -5.286133z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m1665.2179 1067.0526l0 0c0 -2.9195557 -2.3666992 -5.286255 -5.286255 -5.286255l-117.837036 0c-1.4019775 0 -2.746582 0.55700684 -3.737915 1.5483398c-0.991333 0.991333 -1.5483398 2.3359375 -1.5483398 3.737915l0 21.144165c0 2.9194336 2.3666992 5.286133 5.286255 5.286133l117.837036 0c2.9195557 0 5.286255 -2.3666992 5.286255 -5.286133z" fill-rule="evenodd"/><path fill="#000000" d="m1569.9677 1081.654l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.375 -1.953125q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610107 1.296875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.015625 3.546875l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0zm15.953125 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.94885254 -1.421875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#4a4aff" d="m1533.8398 1209.6035l197.66931 0l0 44.97632l-197.66931 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1533.8398 1209.6035l197.66931 0l0 44.97632l-197.66931 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m1571.211 1236.5234l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm9.266357 4.828125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm6.8323975 0l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.5720215 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm8.75 3.125l3.875 -13.8125l1.3125 0l-3.859375 13.8125l-1.328125 0zm7.9177246 -0.234375l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.84436 4.90625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519897 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm10.672607 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.99572754 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.688232 0q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm12.875732 3.375l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6052246 1.46875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1745.21 421.97113l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1745.21 421.97113l136.22046 0l0 79.1496l-136.22046 0z" fill-rule="evenodd"/><path fill="#000000" d="m1804.6757 443.28424l1.390625 0.1875q-0.234375 1.421875 -1.171875 2.234375q-0.921875 0.8125 -2.28125 0.8125q-1.703125 0 -2.75 -1.109375q-1.03125 -1.125 -1.03125 -3.203125q0 -1.34375 0.4375 -2.34375q0.453125 -1.015625 1.359375 -1.515625q0.921875 -0.5 1.984375 -0.5q1.359375 0 2.21875 0.6875q0.859375 0.671875 1.09375 1.9375l-1.359375 0.203125q-0.203125 -0.828125 -0.703125 -1.25q-0.484375 -0.421875 -1.1875 -0.421875q-1.0625 0 -1.734375 0.765625q-0.65625 0.75 -0.65625 2.40625q0 1.671875 0.640625 2.4375q0.640625 0.75 1.671875 0.75q0.828125 0 1.375 -0.5q0.5625 -0.515625 0.703125 -1.578125zm2.578125 3.046875l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm10.75 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.0390625 1.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#9fc5e8" d="m1628.2518 227.64043l263.71643 0l0 37.574783l-263.71643 0z" fill-rule="evenodd"/><path stroke="#073763" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m1628.2518 227.64043l263.71643 0l0 37.574783l-263.71643 0z" fill-rule="evenodd"/><path fill="#000000" d="m1725.6871 248.16042l-1.90625 -6.21875l1.09375 0l0.984375 3.59375l0.375 1.328125q0.03125 -0.09375 0.328125 -1.28125l0.984375 -3.640625l1.078125 0l0.9375 3.609375l0.3125 1.1875l0.359375 -1.203125l1.0625 -3.59375l1.03125 0l-1.953125 6.21875l-1.09375 0l-0.984375 -3.734375l-0.25 -1.046875l-1.25 4.78125l-1.109375 0zm11.775391 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm6.845703 3.703125l-0.984375 0l0 -8.59375l1.0625 0l0 3.0625q0.671875 -0.828125 1.703125 -0.828125q0.578125 0 1.078125 0.234375q0.515625 0.21875 0.84375 0.640625q0.34375 0.421875 0.53125 1.015625q0.1875 0.59375 0.1875 1.265625q0 1.59375 -0.796875 2.46875q-0.796875 0.875 -1.890625 0.875q-1.109375 0 -1.734375 -0.921875l0 0.78125zm-0.015625 -3.15625q0 1.109375 0.3125 1.609375q0.5 0.8125 1.34375 0.8125q0.6875 0 1.1875 -0.59375q0.515625 -0.59375 0.515625 -1.796875q0 -1.21875 -0.484375 -1.796875q-0.484375 -0.578125 -1.171875 -0.578125q-0.6875 0 -1.203125 0.609375q-0.5 0.59375 -0.5 1.734375zm5.798828 3.15625l0 -8.59375l3.234375 0q0.984375 0 1.578125 0.265625q0.59375 0.265625 0.921875 0.8125q0.34375 0.53125 0.34375 1.125q0 0.546875 -0.296875 1.03125q-0.296875 0.484375 -0.90625 0.78125q0.78125 0.234375 1.1875 0.796875q0.421875 0.546875 0.421875 1.296875q0 0.59375 -0.25 1.125q-0.25 0.515625 -0.625 0.796875q-0.375 0.28125 -0.953125 0.421875q-0.5625 0.140625 -1.375 0.140625l-3.28125 0zm1.140625 -4.984375l1.859375 0q0.75 0 1.078125 -0.09375q0.4375 -0.125 0.65625 -0.421875q0.21875 -0.3125 0.21875 -0.765625q0 -0.421875 -0.203125 -0.75q-0.203125 -0.328125 -0.59375 -0.4375q-0.375 -0.125 -1.296875 -0.125l-1.71875 0l0 2.59375zm0 3.96875l2.140625 0q0.546875 0 0.765625 -0.046875q0.40625 -0.0625 0.65625 -0.21875q0.265625 -0.171875 0.4375 -0.484375q0.171875 -0.3125 0.171875 -0.71875q0 -0.484375 -0.25 -0.84375q-0.234375 -0.359375 -0.671875 -0.5q-0.4375 -0.140625 -1.265625 -0.140625l-1.984375 0l0 2.953125zm6.7539062 1.015625l0 -8.59375l1.0625 0l0 8.59375l-1.0625 0zm6.7755127 0l0 -0.921875q-0.734375 1.0625 -1.984375 1.0625q-0.546875 0 -1.03125 -0.203125q-0.46875 -0.21875 -0.703125 -0.53125q-0.234375 -0.328125 -0.328125 -0.796875q-0.0625 -0.296875 -0.0625 -0.984375l0 -3.84375l1.0625 0l0 3.453125q0 0.8125 0.0625 1.109375q0.09375 0.40625 0.40625 0.65625q0.328125 0.234375 0.8125 0.234375q0.46875 0 0.875 -0.234375q0.421875 -0.25 0.59375 -0.671875q0.1875 -0.421875 0.1875 -1.21875l0 -3.328125l1.046875 0l0 6.21875l-0.9375 0zm6.845703 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm8.173828 2.765625l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.595703 0q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.375 -1.5 0.375q-1.296875 0 -2.109375 -0.828125q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm8.283203 2.171875l0.15625 0.921875q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.1875 -0.453125 -0.484375q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm1.0371094 0.9375l0 -8.59375l1.046875 0l0 3.078125q0.734375 -0.84375 1.859375 -0.84375q0.703125 0 1.203125 0.28125q0.515625 0.265625 0.734375 0.75q0.21875 0.46875 0.21875 1.390625l0 3.9375l-1.046875 0l0 -3.9375q0 -0.796875 -0.34375 -1.15625q-0.34375 -0.359375 -0.96875 -0.359375q-0.46875 0 -0.890625 0.25q-0.40625 0.234375 -0.59375 0.65625q-0.171875 0.40625 -0.171875 1.140625l0 3.40625l-1.046875 0z" fill-rule="nonzero"/></g></svg>
diff --git a/chromeos/network/managed_network_configuration_handler.h b/chromeos/network/managed_network_configuration_handler.h index 414023a..bd79547e 100644 --- a/chromeos/network/managed_network_configuration_handler.h +++ b/chromeos/network/managed_network_configuration_handler.h
@@ -61,6 +61,7 @@ virtual void AddObserver(NetworkPolicyObserver* observer) = 0; virtual void RemoveObserver(NetworkPolicyObserver* observer) = 0; + virtual bool HasObserver(NetworkPolicyObserver* observer) const = 0; // Provides the properties of the network with |service_path| to |callback|. // |userhash| is used to set the "Source" property. If not provided then @@ -203,6 +204,10 @@ // Return the list of blocked WiFi networks (identified by HexSSIDs). virtual std::vector<std::string> GetBlockedHexSSIDs() const = 0; + // Called just before destruction to give observers a chance to remove + // themselves and disable any networking. + virtual void Shutdown() = 0; + static std::unique_ptr<ManagedNetworkConfigurationHandler> InitializeForTesting( NetworkStateHandler* network_state_handler,
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc index dbe094d5..102684e 100644 --- a/chromeos/network/managed_network_configuration_handler_impl.cc +++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -198,6 +198,24 @@ observers_.RemoveObserver(observer); } +bool ManagedNetworkConfigurationHandlerImpl::HasObserver( + NetworkPolicyObserver* observer) const { + return observers_.HasObserver(observer); +} + +void ManagedNetworkConfigurationHandlerImpl::Shutdown() { + if (did_shutdown_) + return; // May get called twice in tests. + + did_shutdown_ = true; + if (network_profile_handler_ && network_profile_handler_->HasObserver(this)) + network_profile_handler_->RemoveObserver(this); + network_profile_handler_ = nullptr; + + for (auto& observer : observers_) + observer.OnManagedNetworkConfigurationHandlerShuttingDown(); +} + void ManagedNetworkConfigurationHandlerImpl::GetManagedProperties( const std::string& userhash, const std::string& service_path, @@ -918,8 +936,10 @@ ManagedNetworkConfigurationHandlerImpl:: ~ManagedNetworkConfigurationHandlerImpl() { - if (network_profile_handler_) + if (network_profile_handler_ && network_profile_handler_->HasObserver(this)) network_profile_handler_->RemoveObserver(this); + + Shutdown(); } void ManagedNetworkConfigurationHandlerImpl::Init(
diff --git a/chromeos/network/managed_network_configuration_handler_impl.h b/chromeos/network/managed_network_configuration_handler_impl.h index b46084bb..bc1e26b6 100644 --- a/chromeos/network/managed_network_configuration_handler_impl.h +++ b/chromeos/network/managed_network_configuration_handler_impl.h
@@ -46,6 +46,7 @@ // ManagedNetworkConfigurationHandler overrides void AddObserver(NetworkPolicyObserver* observer) override; void RemoveObserver(NetworkPolicyObserver* observer) override; + bool HasObserver(NetworkPolicyObserver* observer) const override; void GetProperties(const std::string& userhash, const std::string& service_path, @@ -139,6 +140,8 @@ void OnPoliciesApplied(const NetworkProfile& profile) override; + void Shutdown() override; + private: friend class AutoConnectHandlerTest; friend class ClientCertResolverTest; @@ -266,6 +269,8 @@ bool user_policy_applied_ = false; bool device_policy_applied_ = false; + // Ensure that Shutdown() gets called exactly once. + bool did_shutdown_ = false; // For Shill client callbacks base::WeakPtrFactory<ManagedNetworkConfigurationHandlerImpl>
diff --git a/chromeos/network/mock_managed_network_configuration_handler.h b/chromeos/network/mock_managed_network_configuration_handler.h index d47d41ef..8b400072 100644 --- a/chromeos/network/mock_managed_network_configuration_handler.h +++ b/chromeos/network/mock_managed_network_configuration_handler.h
@@ -29,6 +29,8 @@ // ManagedNetworkConfigurationHandler overrides MOCK_METHOD1(AddObserver, void(NetworkPolicyObserver* observer)); MOCK_METHOD1(RemoveObserver, void(NetworkPolicyObserver* observer)); + MOCK_CONST_METHOD1(HasObserver, bool(NetworkPolicyObserver* observer)); + MOCK_METHOD0(Shutdown, void()); MOCK_METHOD3(GetProperties, void(const std::string& userhash, const std::string& service_path,
diff --git a/chromeos/network/network_policy_observer.h b/chromeos/network/network_policy_observer.h index 69d2b93..f7f8ad2 100644 --- a/chromeos/network/network_policy_observer.h +++ b/chromeos/network/network_policy_observer.h
@@ -27,6 +27,10 @@ // Called every time a network is created or updated because of a policy. virtual void PolicyAppliedToNetwork(const std::string& service_path) {} + // Called just before ManagedNetworkConfigurationHandler is destroyed so that + // observers can safely stop observing. + virtual void OnManagedNetworkConfigurationHandlerShuttingDown() {} + protected: virtual ~NetworkPolicyObserver() {} };
diff --git a/chromeos/network/network_profile_handler.cc b/chromeos/network/network_profile_handler.cc index 98787a0..3cb7ff5f 100644 --- a/chromeos/network/network_profile_handler.cc +++ b/chromeos/network/network_profile_handler.cc
@@ -82,6 +82,10 @@ observers_.RemoveObserver(observer); } +bool NetworkProfileHandler::HasObserver(NetworkProfileObserver* observer) { + return observers_.HasObserver(observer); +} + void NetworkProfileHandler::GetManagerPropertiesCallback( absl::optional<base::Value> properties) { if (!properties) { @@ -264,6 +268,9 @@ } NetworkProfileHandler::~NetworkProfileHandler() { + if (!ShillManagerClient::Get()) + return; + ShillManagerClient::Get()->RemovePropertyChangedObserver(this); }
diff --git a/chromeos/network/network_profile_handler.h b/chromeos/network/network_profile_handler.h index e88a7e5..7c2298c 100644 --- a/chromeos/network/network_profile_handler.h +++ b/chromeos/network/network_profile_handler.h
@@ -34,6 +34,7 @@ void AddObserver(NetworkProfileObserver* observer); void RemoveObserver(NetworkProfileObserver* observer); + bool HasObserver(NetworkProfileObserver* observer); void GetManagerPropertiesCallback(absl::optional<base::Value> properties);
diff --git a/chromeos/resources/BUILD.gn b/chromeos/resources/BUILD.gn index 73699e56..681cfb5 100644 --- a/chromeos/resources/BUILD.gn +++ b/chromeos/resources/BUILD.gn
@@ -28,7 +28,6 @@ deps = [ "//chromeos/language/public/mojom:mojom_js", "//chromeos/services/bluetooth_config/public/mojom:mojom_js", - "//chromeos/services/cellular_setup/public/mojom:mojom_js", # Generated ml service js bindings are required by external clients, the # clients are not found within Chromium. The clients pull the generated
diff --git a/chromeos/resources/cellular_resources.grdp b/chromeos/resources/cellular_resources.grdp deleted file mode 100644 index be213e6..0000000 --- a/chromeos/resources/cellular_resources.grdp +++ /dev/null
@@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<grit-part> - <include name="IDR_CELLULAR_SETUP_MOJOM_HTML" - file="${mojom_root}/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.html" - resource_path="mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.html" - use_base_dir="false" - type="BINDATA" /> - <include name="IDR_CELLULAR_SETUP_MOJOM_LITE_JS" - file="${mojom_root}/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js" - resource_path="mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js" - use_base_dir="false" - type="BINDATA" /> - <include name="IDR_ESIM_MANAGER_MOJOM_HTML" - file="${mojom_root}/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.html" - resource_path="mojo/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.html" - use_base_dir="false" - type="BINDATA" /> - <include name="IDR_ESIM_MANAGER_MOJOM_LITE_JS" - file="${mojom_root}/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js" - resource_path="mojo/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js" - use_base_dir="false" - type="BINDATA" /> -</grit-part>
diff --git a/chromeos/resources/chromeos_resources.grd b/chromeos/resources/chromeos_resources.grd index 231381ee..d854d1a 100644 --- a/chromeos/resources/chromeos_resources.grd +++ b/chromeos/resources/chromeos_resources.grd
@@ -12,7 +12,6 @@ </outputs> <release seq="1"> <includes> - <part file="cellular_resources.grdp" /> <part file="cros_bluetooth_config_resources.grdp" /> <part file="cros_network_config_resources.grdp" /> <part file="network_health_resources.grdp" />
diff --git a/chromeos/services/BUILD.gn b/chromeos/services/BUILD.gn index 34c66666..4c12e9f 100644 --- a/chromeos/services/BUILD.gn +++ b/chromeos/services/BUILD.gn
@@ -21,7 +21,6 @@ deps = [ "//chromeos/services/assistant:tests", "//chromeos/services/bluetooth_config:unit_tests", - "//chromeos/services/cellular_setup:unit_tests", "//chromeos/services/cros_healthd/private/cpp:unit_tests", "//chromeos/services/cros_healthd/public/cpp:unit_tests", "//chromeos/services/device_sync:unit_tests",
diff --git a/chromeos/services/libassistant/network_provider_impl.h b/chromeos/services/libassistant/network_provider_impl.h index bc142726..dd3e9e07 100644 --- a/chromeos/services/libassistant/network_provider_impl.h +++ b/chromeos/services/libassistant/network_provider_impl.h
@@ -44,6 +44,7 @@ void OnDeviceStateListChanged() override {} void OnVpnProvidersChanged() override {} void OnNetworkCertificatesChanged() override {} + void OnPoliciesApplied(const std::string& userhash) override {} private: ConnectionStatus connection_status_;
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index 662c09d6..5dd347f4 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -2201,7 +2201,7 @@ } CrosNetworkConfig::~CrosNetworkConfig() { - if (network_state_handler_->HasObserver(this)) + if (network_state_handler_ && network_state_handler_->HasObserver(this)) network_state_handler_->RemoveObserver(this, FROM_HERE); if (network_certificate_handler_ && network_certificate_handler_->HasObserver(this)) { @@ -2209,6 +2209,10 @@ } if (cellular_inhibitor_ && cellular_inhibitor_->HasObserver(this)) cellular_inhibitor_->RemoveObserver(this); + if (network_configuration_handler_ && + network_configuration_handler_->HasObserver(this)) { + network_configuration_handler_->RemoveObserver(this); + } } void CrosNetworkConfig::BindReceiver( @@ -2227,6 +2231,10 @@ } if (cellular_inhibitor_ && !cellular_inhibitor_->HasObserver(this)) cellular_inhibitor_->AddObserver(this); + if (network_configuration_handler_ && + !network_configuration_handler_->HasObserver(this)) { + network_configuration_handler_->AddObserver(this); + } observers_.Add(std::move(observer)); } @@ -3372,6 +3380,19 @@ DeviceListChanged(); } +void CrosNetworkConfig::PoliciesApplied(const std::string& userhash) { + for (auto& observer : observers_) + observer->OnPoliciesApplied(userhash); +} + +void CrosNetworkConfig::OnManagedNetworkConfigurationHandlerShuttingDown() { + if (network_configuration_handler_ && + network_configuration_handler_->HasObserver(this)) { + network_configuration_handler_->RemoveObserver(this); + } + network_configuration_handler_ = nullptr; +} + const std::string& CrosNetworkConfig::GetServicePathFromGuid( const std::string& guid) { const chromeos::NetworkState* network =
diff --git a/chromeos/services/network_config/cros_network_config.h b/chromeos/services/network_config/cros_network_config.h index 9aebd922..f5e8610 100644 --- a/chromeos/services/network_config/cros_network_config.h +++ b/chromeos/services/network_config/cros_network_config.h
@@ -9,6 +9,7 @@ #include "base/memory/weak_ptr.h" #include "chromeos/network/cellular_inhibitor.h" #include "chromeos/network/network_certificate_handler.h" +#include "chromeos/network/network_policy_observer.h" #include "chromeos/network/network_profile_handler.h" #include "chromeos/network/network_state_handler_observer.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" @@ -30,7 +31,8 @@ class CrosNetworkConfig : public mojom::CrosNetworkConfig, public NetworkStateHandlerObserver, public NetworkCertificateHandler::Observer, - public CellularInhibitor::Observer { + public CellularInhibitor::Observer, + public NetworkPolicyObserver { public: // Constructs an instance of CrosNetworkConfig with default network subsystem // dependencies appropriate for a production environment. @@ -169,12 +171,16 @@ void ScanCompleted(const DeviceState* device) override; void NetworkConnectionStateChanged(const NetworkState* network) override; - // NetworkCertificateHandler::Observer + // NetworkCertificateHandler::Observer: void OnCertificatesChanged() override; // CellularInhibitor::Observer: void OnInhibitStateChanged() override; + // NetworkPolicyObserver: + void PoliciesApplied(const std::string& userhash) override; + void OnManagedNetworkConfigurationHandlerShuttingDown() override; + const std::string& GetServicePathFromGuid(const std::string& guid); NetworkStateHandler* network_state_handler_; // Unowned
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc index 919c918..21826cf0 100644 --- a/chromeos/services/network_config/cros_network_config_unittest.cc +++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -1883,6 +1883,29 @@ EXPECT_EQ("blocked_ssid2", policy->blocked_hex_ssids[1]); } +TEST_F(CrosNetworkConfigTest, GlobalPolicyApplied) { + SetupObserver(); + EXPECT_EQ(0, observer()->GetPolicyAppliedCount(/*userhash=*/std::string())); + + base::DictionaryValue global_config; + global_config.SetBoolKey( + ::onc::global_network_config::kAllowOnlyPolicyCellularNetworks, true); + global_config.SetBoolKey( + ::onc::global_network_config::kAllowOnlyPolicyWiFiToConnect, false); + managed_network_configuration_handler()->SetPolicy( + ::onc::ONC_SOURCE_DEVICE_POLICY, /*userhash=*/std::string(), + base::ListValue(), global_config); + base::RunLoop().RunUntilIdle(); + mojom::GlobalPolicyPtr policy = GetGlobalPolicy(); + ASSERT_TRUE(policy); + EXPECT_EQ(true, policy->allow_only_policy_cellular_networks); + EXPECT_EQ(false, policy->allow_only_policy_networks_to_autoconnect); + EXPECT_EQ(false, policy->allow_only_policy_wifi_networks_to_connect); + EXPECT_EQ(false, + policy->allow_only_policy_wifi_networks_to_connect_if_available); + EXPECT_EQ(1, observer()->GetPolicyAppliedCount(/*userhash=*/std::string())); +} + TEST_F(CrosNetworkConfigTest, StartConnect) { // wifi1 is already connected, StartConnect should fail. mojom::StartConnectResult result = StartConnect("wifi1_guid"); @@ -2263,5 +2286,15 @@ /*expected_success=*/false, &expected_auto_reset, &expected_reset_day); } +// Make sure calling shutdown before cros_network_config destruction doesn't +// cause a crash. +TEST_F(CrosNetworkConfigTest, Shutdown) { + SetupObserver(); + base::RunLoop().RunUntilIdle(); + + NetworkHandler::Get()->network_state_handler()->Shutdown(); + NetworkHandler::Get()->managed_network_configuration_handler()->Shutdown(); +} + } // namespace network_config } // namespace chromeos
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.cc b/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.cc index a7047a1..92b61313 100644 --- a/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.cc +++ b/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.cc
@@ -21,7 +21,12 @@ } CrosNetworkConfigTestHelper::~CrosNetworkConfigTestHelper() { + Shutdown(); +} + +void CrosNetworkConfigTestHelper::Shutdown() { OverrideInProcessInstanceForTesting(nullptr); + cros_network_config_impl_.reset(); } network_config::mojom::NetworkStatePropertiesPtr
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h b/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h index b97347196..ea6ec58 100644 --- a/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h +++ b/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h
@@ -55,6 +55,10 @@ ManagedNetworkConfigurationHandler* network_configuration_handler); protected: + // Called in |~CrosNetworkConfigTestHelper()| to set the global network config + // to nullptr and destroy cros_network_config_impl_. + void Shutdown(); + NetworkStateTestHelper network_state_helper_{ /*use_default_devices_and_services=*/false}; std::unique_ptr<CrosNetworkConfig> cros_network_config_impl_;
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.cc b/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.cc index e5dc7874..25a04b0 100644 --- a/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.cc +++ b/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.cc
@@ -20,8 +20,16 @@ int CrosNetworkConfigTestObserver::GetNetworkChangedCount( const std::string& guid) const { - const auto iter = networks_changed_.find(guid); - if (iter == networks_changed_.end()) + const auto iter = guid_to_networks_changed_count_map_.find(guid); + if (iter == guid_to_networks_changed_count_map_.end()) + return 0; + return iter->second; +} + +int CrosNetworkConfigTestObserver::GetPolicyAppliedCount( + const std::string& userhash) const { + const auto iter = userhash_to_policies_applied_count_map_.find(userhash); + if (iter == userhash_to_policies_applied_count_map_.end()) return 0; return iter->second; } @@ -33,7 +41,7 @@ void CrosNetworkConfigTestObserver::OnNetworkStateChanged( chromeos::network_config::mojom::NetworkStatePropertiesPtr network) { - networks_changed_[network->guid]++; + guid_to_networks_changed_count_map_[network->guid]++; } void CrosNetworkConfigTestObserver::OnNetworkStateListChanged() { @@ -52,9 +60,15 @@ network_certificates_changed_++; } +void CrosNetworkConfigTestObserver::OnPoliciesApplied( + const std::string& userhash) { + userhash_to_policies_applied_count_map_[userhash]++; +} + void CrosNetworkConfigTestObserver::ResetNetworkChanges() { active_networks_changed_ = 0; - networks_changed_.clear(); + guid_to_networks_changed_count_map_.clear(); + userhash_to_policies_applied_count_map_.clear(); network_state_list_changed_ = 0; device_state_list_changed_ = 0; vpn_providers_changed_ = 0;
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.h b/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.h index 5a831d8..69c53b4 100644 --- a/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.h +++ b/chromeos/services/network_config/public/cpp/cros_network_config_test_observer.h
@@ -5,9 +5,9 @@ #ifndef CHROMEOS_SERVICES_NETWORK_CONFIG_PUBLIC_CPP_CROS_NETWORK_CONFIG_TEST_OBSERVER_H_ #define CHROMEOS_SERVICES_NETWORK_CONFIG_PUBLIC_CPP_CROS_NETWORK_CONFIG_TEST_OBSERVER_H_ -#include <map> #include <string> +#include "base/containers/flat_map.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -37,6 +37,7 @@ void OnDeviceStateListChanged() override; void OnVpnProvidersChanged() override; void OnNetworkCertificatesChanged() override; + void OnPoliciesApplied(const std::string& userhash) override; int active_networks_changed() const { return active_networks_changed_; } int network_state_list_changed() const { return network_state_list_changed_; } @@ -47,6 +48,7 @@ } int GetNetworkChangedCount(const std::string& guid) const; + int GetPolicyAppliedCount(const std::string& userhash) const; void ResetNetworkChanges(); mojo::Receiver<mojom::CrosNetworkConfigObserver>& receiver() { @@ -58,7 +60,8 @@ private: mojo::Receiver<mojom::CrosNetworkConfigObserver> receiver_{this}; int active_networks_changed_ = 0; - std::map<std::string, int> networks_changed_; + base::flat_map<std::string, int> guid_to_networks_changed_count_map_; + base::flat_map<std::string, int> userhash_to_policies_applied_count_map_; int network_state_list_changed_ = 0; int device_state_list_changed_ = 0; int vpn_providers_changed_ = 0;
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom index b09dd34..f71f4d3 100644 --- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom +++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -1201,4 +1201,7 @@ // Fired when the server CA or user certificate lists change. Use // GetNetworkCertificates if the updated certificate lists are required. OnNetworkCertificatesChanged(); + + // Fired when managed policies for |userhash| are applied to networks. + OnPoliciesApplied(string userhash); };
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java b/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java index e579cab0..9759a06 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java
@@ -36,7 +36,8 @@ import java.util.List; /** Handles validation and display of one field from the {@link EditorFieldModel}. */ -@VisibleForTesting +// TODO(b/173103628): Re-enable this +//@VisibleForTesting public class EditorTextField extends FrameLayout implements EditorFieldView, View.OnClickListener { // TODO(crbug.com/1300201): Replace with EditorDialog field once migrated. /** The indicator for input fields that are required. */
diff --git a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc index 3ef89d2..7912eff 100644 --- a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc
@@ -680,13 +680,13 @@ TEST_F(AutocompleteSyncBridgeTest, LoadMetadataReportsErrorForMissingDB) { ON_CALL(*backend(), GetDatabase()).WillByDefault(Return(nullptr)); - EXPECT_CALL(mock_processor(), ReportError(_)); + EXPECT_CALL(mock_processor(), ReportError); ResetBridge(); } TEST_F(AutocompleteSyncBridgeTest, MergeSyncDataEmpty) { - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // The bridge should still commit the model type state change. EXPECT_CALL(*backend(), CommitChanges()); @@ -700,8 +700,8 @@ const AutofillSpecifics specifics1 = CreateSpecifics(1, {2}); const AutofillSpecifics specifics2 = CreateSpecifics(2, {3, 4}); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -716,7 +716,7 @@ EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(specifics1), _)); EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(specifics2), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); ApplyAdds({specifics1, specifics2}); VerifyAllData({specifics1, specifics2}); @@ -752,7 +752,7 @@ EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(merged4), _)); EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(merged5), _)); EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(merged6), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); ApplyAdds({local1, local2, local3, local4, local5, local6}); @@ -774,7 +774,7 @@ EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(local1), _)); EXPECT_CALL(mock_processor(), Put(_, HasSpecifics(merged4), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); ApplyAdds({local1, specifics3, local4});
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc index 381e42b..1b7749f9 100644 --- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
@@ -525,7 +525,7 @@ AutofillProfileChange change(AutofillProfileChange::UPDATE, server_profile.guid(), &server_profile); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); // Should not crash. bridge()->AutofillProfileChanged(change); } @@ -553,7 +553,7 @@ AutofillProfileChange change(AutofillProfileChange::REMOVE, server_profile.guid(), &server_profile); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); // Should not crash. bridge()->AutofillProfileChanged(change); } @@ -631,7 +631,7 @@ EXPECT_CALL( mock_processor(), Put(kGuidA, HasSpecifics(CreateAutofillProfileSpecifics(local1)), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote1_specifics, remote2_specifics, remote3_specifics}); @@ -709,7 +709,7 @@ // Ensure that all profile fields are able to be synced down from the server to // the client (and nothing gets uploaded back). TEST_P(AutofillProfileSyncBridgeTest, MergeSyncData_SyncAllFieldsToClient) { - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({ConstructCompleteSpecifics()}); @@ -797,7 +797,7 @@ EXPECT_CALL( mock_processor(), Put(kGuidA, HasSpecifics(CreateAutofillProfileSpecifics(local)), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); @@ -865,7 +865,7 @@ EXPECT_CALL( mock_processor(), Put(kGuidB, HasSpecifics(CreateAutofillProfileSpecifics(local2)), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote1_specifics, remote2_specifics}); @@ -993,7 +993,7 @@ ASSERT_FALSE(remote.has_origin()); // Expect no sync events to add origin to the remote data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); @@ -1024,7 +1024,7 @@ remote.clear_origin(); ASSERT_FALSE(remote.has_origin()); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(local)); @@ -1043,8 +1043,8 @@ AutofillProfileSpecifics remote = CreateAutofillProfileSpecifics(remote_profile); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()); syncer::EntityChangeList entity_change_list; @@ -1065,7 +1065,7 @@ AutofillProfileSpecifics remote_invalid = CreateAutofillProfileSpecifics(kGuidInvalid, std::string()); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); syncer::EntityChangeList entity_change_list; @@ -1168,7 +1168,7 @@ remote.set_address_home_line2("Apt. 42"); // No update to sync, no change in local data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(local)); @@ -1187,7 +1187,7 @@ ASSERT_FALSE(remote.has_address_home_language_code()); // No update to sync, no change in local data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(local)); @@ -1206,7 +1206,7 @@ remote.set_address_home_language_code("en"); // No update to sync, remote language code overwrites the empty local one. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(CreateAutofillProfile(remote))); @@ -1225,7 +1225,7 @@ remote.set_address_home_language_code("en"); // No update to sync, remote language code overwrites the local one. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(CreateAutofillProfile(remote))); @@ -1254,7 +1254,7 @@ merged.FinalizeAfterImport(); // No update to sync, remote language code overwrites the local one. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(merged)); @@ -1273,7 +1273,7 @@ ASSERT_FALSE(remote.is_client_validity_states_updated()); // No update to sync, no change in local data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(local)); @@ -1292,7 +1292,7 @@ ASSERT_TRUE(remote.has_validity_state_bitfield()); // No update to sync, the validity bitfield should be stored to local. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(CreateAutofillProfile(remote))); @@ -1311,7 +1311,7 @@ ASSERT_TRUE(remote.has_validity_state_bitfield()); // No update to sync, the remote validity bitfield should overwrite local. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(CreateAutofillProfile(remote))); @@ -1336,7 +1336,7 @@ merged.FinalizeAfterImport(); // No update to sync, the local validity bitfield should stay untouched. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(merged)); @@ -1357,7 +1357,7 @@ remote.add_name_first(std::string("John")); // No update to sync, no change in local data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(local)); @@ -1415,7 +1415,7 @@ NAME_LAST, u"Smith", structured_address::VerificationStatus::kObserved); // No update to sync, merged changes in local data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(merged)); @@ -1439,7 +1439,7 @@ remote.set_address_home_language_code("en"); // No update to sync, no change in local data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote}); EXPECT_THAT(GetAllLocalData(), ElementsAre(WithUsageStats(local))); @@ -1495,7 +1495,7 @@ merged.set_use_date(test_case.merged_use_date); // Expect no changes to remote data. - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); StartSyncing({remote});
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc index 8670255..01ed4da1 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
@@ -659,7 +659,7 @@ CreditCard updated_card = CreateServerCreditCardWithDetails( kCard1ServerId, /*use_count=*/2, /*use_date=*/5); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); // Local changes should not cause local DB writes. EXPECT_CALL(*backend(), CommitChanges()).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); @@ -697,7 +697,7 @@ CreditCard updated_card = CreateServerCreditCardWithDetails( kCard1ServerId, /*use_count=*/2, /*use_date=*/5); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); // Local changes should not cause local DB writes. EXPECT_CALL(*backend(), CommitChanges()).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); @@ -876,7 +876,7 @@ // Check that there is no metadata, from start on. ASSERT_THAT(GetAllLocalDataInclRestart(), IsEmpty()); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); // Local changes should not cause local DB writes. EXPECT_CALL(*backend(), CommitChanges()).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); @@ -993,7 +993,7 @@ AdvanceTestClockByTwoYears(); // Since the entities are non-oprhans, they should not get deleted. - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()).Times(0); ResetBridge(); @@ -1020,7 +1020,7 @@ CreateServerCreditCardFromSpecifics(card).GetMetadata()); // We do not advance time so the orphans are recent, should not get deleted. - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()).Times(0); ResetBridge(); @@ -1063,7 +1063,7 @@ Put(kAddr1StorageKey, HasSpecifics(preexisting_profile), _)); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(preexisting_card), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1108,7 +1108,7 @@ // Upload _only_ the unique local data, only the card. EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(preexisting_card), _)); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1205,8 +1205,8 @@ TEST_P(AutofillWalletMetadataSyncBridgeRemoteChangesTest, EmptyUpdateIgnored) { ResetBridgeWithPotentialInitialSync({}); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // We still need to commit the updated progress marker. EXPECT_CALL(*backend(), CommitChanges()); @@ -1230,8 +1230,8 @@ table()->SetServerCreditCards({CreateServerCreditCardFromSpecifics(card)}); ResetBridgeWithPotentialInitialSync({profile, card}); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // We still need to commit the updated progress marker. EXPECT_CALL(*backend(), CommitChanges()); @@ -1265,8 +1265,8 @@ CreateWalletMetadataSpecificsForCardWithDetails( kCard1SpecificsId, /*use_count=*/30, /*use_date=*/60); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1300,7 +1300,7 @@ CreateWalletMetadataSpecificsForCardWithDetails( kCard1SpecificsId, /*use_count=*/3, /*use_date=*/6); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kAddr1StorageKey, HasSpecifics(profile), _)); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(card), _)); @@ -1345,7 +1345,7 @@ CreateWalletMetadataSpecificsForCardWithDetails( kCard1SpecificsId, /*use_count=*/30, /*use_date=*/60); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kAddr1StorageKey, HasSpecifics(merged_profile), _)); EXPECT_CALL(mock_processor(), @@ -1391,7 +1391,7 @@ CreateWalletMetadataSpecificsForCardWithDetails( kCard1SpecificsId, /*use_count=*/30, /*use_date=*/60); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kAddr1StorageKey, HasSpecifics(merged_profile), _)); EXPECT_CALL(mock_processor(), @@ -1429,8 +1429,8 @@ CreateWalletMetadataSpecificsForCardWithDetails( kCard1SpecificsId, /*use_count=*/30, /*use_date=*/6); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1460,8 +1460,8 @@ kCard1SpecificsId, /*use_count=*/3, /*use_date=*/6, /*billing_address_id=*/kLocalAddr1ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1489,7 +1489,7 @@ kCard1SpecificsId, /*use_count=*/3, /*use_date=*/6, /*billing_address_id=*/kAddr1ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(card), _)); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // We still need to commit the updated progress marker. @@ -1519,8 +1519,8 @@ kCard1SpecificsId, /*use_count=*/3, /*use_date=*/60, /*billing_address_id=*/kLocalAddr2ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1548,7 +1548,7 @@ kCard1SpecificsId, /*use_count=*/3, /*use_date=*/6, /*billing_address_id=*/kLocalAddr2ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(card), _)); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // We still need to commit the updated progress marker. @@ -1578,8 +1578,8 @@ kCard1SpecificsId, /*use_count=*/3, /*use_date=*/60, /*billing_address_id=*/kAddr2ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1607,7 +1607,7 @@ kCard1SpecificsId, /*use_count=*/3, /*use_date=*/6, /*billing_address_id=*/kAddr2ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(card), _)); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // We still need to commit the updated progress marker. @@ -1645,7 +1645,7 @@ kCard1SpecificsId, /*use_count=*/30, /*use_date=*/60, /*billing_address_id=*/kAddr2ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(merged_card), _)); EXPECT_CALL(*backend(), CommitChanges()); @@ -1683,7 +1683,7 @@ kCard1SpecificsId, /*use_count=*/30, /*use_date=*/60, /*billing_address_id=*/kAddr1ServerId); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kCard1StorageKey, HasSpecifics(merged_card), _)); EXPECT_CALL(*backend(), CommitChanges()); @@ -1713,8 +1713,8 @@ kAddr1SpecificsId, /*use_count=*/1, /*use_date=*/50, /*has_converted=*/true); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); - EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); + EXPECT_CALL(mock_processor(), Put).Times(0); EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); @@ -1741,7 +1741,7 @@ kAddr1SpecificsId, /*use_count=*/1, /*use_date=*/50, /*has_converted=*/false); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kAddr1StorageKey, HasSpecifics(profile), _)); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); @@ -1778,7 +1778,7 @@ kAddr1SpecificsId, /*use_count=*/10, /*use_date=*/50, /*has_converted=*/true); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kAddr1StorageKey, HasSpecifics(merged_profile), _)); EXPECT_CALL(*backend(), CommitChanges()); @@ -1814,7 +1814,7 @@ kAddr1SpecificsId, /*use_count=*/10, /*use_date=*/50, /*has_converted=*/true); - EXPECT_CALL(mock_processor(), Delete(_, _)).Times(0); + EXPECT_CALL(mock_processor(), Delete).Times(0); EXPECT_CALL(mock_processor(), Put(kAddr1StorageKey, HasSpecifics(merged_profile), _)); EXPECT_CALL(*backend(), CommitChanges());
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc index 682b8d5..fa9fa08 100644 --- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -64,7 +64,6 @@ using syncer::KeyAndData; using syncer::MockModelTypeChangeProcessor; using syncer::ModelType; -using testing::_; using testing::NiceMock; using testing::Pointee; using testing::Return; @@ -632,8 +631,8 @@ EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); EXPECT_CALL(*backend(), CommitChanges()); - EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged(_)).Times(0); - EXPECT_CALL(*backend(), NotifyOfCreditCardChanged(_)).Times(0); + EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged).Times(0); + EXPECT_CALL(*backend(), NotifyOfCreditCardChanged).Times(0); StartSyncing({profile_specifics, card_specifics, customer_data_specifics2, cloud_token_data_specifics}); @@ -675,8 +674,8 @@ EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); EXPECT_CALL(*backend(), CommitChanges()); - EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged(_)).Times(0); - EXPECT_CALL(*backend(), NotifyOfCreditCardChanged(_)).Times(0); + EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged).Times(0); + EXPECT_CALL(*backend(), NotifyOfCreditCardChanged).Times(0); StartSyncing({profile_specifics, card_specifics, customer_data_specifics, cloud_token_data_specifics2}); @@ -723,8 +722,8 @@ EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); EXPECT_CALL(*backend(), CommitChanges()); - EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged(_)).Times(0); - EXPECT_CALL(*backend(), NotifyOfCreditCardChanged(_)).Times(0); + EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged).Times(0); + EXPECT_CALL(*backend(), NotifyOfCreditCardChanged).Times(0); StartSyncing({}); EXPECT_TRUE(GetAllLocalData().empty()); @@ -763,8 +762,8 @@ EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); // We still need to commit the updated progress marker on the client. EXPECT_CALL(*backend(), CommitChanges()); - EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged(_)).Times(0); - EXPECT_CALL(*backend(), NotifyOfCreditCardChanged(_)).Times(0); + EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged).Times(0); + EXPECT_CALL(*backend(), NotifyOfCreditCardChanged).Times(0); StartSyncing({profile_specifics, card_specifics, customer_data_specifics, cloud_token_data_specifics}); @@ -979,8 +978,8 @@ EXPECT_CALL(*backend(), CommitChanges()); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()); - EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged(_)).Times(0); - EXPECT_CALL(*backend(), NotifyOfCreditCardChanged(_)).Times(0); + EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged).Times(0); + EXPECT_CALL(*backend(), NotifyOfCreditCardChanged).Times(0); // Passing in a non-null metadata change list indicates to the bridge that // sync is stopping because it was disabled. @@ -1007,8 +1006,8 @@ // We do not write to DB at all, so we should not commit any changes. EXPECT_CALL(*backend(), CommitChanges()).Times(0); EXPECT_CALL(*backend(), NotifyOfMultipleAutofillChanges()).Times(0); - EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged(_)).Times(0); - EXPECT_CALL(*backend(), NotifyOfCreditCardChanged(_)).Times(0); + EXPECT_CALL(*backend(), NotifyOfAutofillProfileChanged).Times(0); + EXPECT_CALL(*backend(), NotifyOfCreditCardChanged).Times(0); // Passing in a non-null metadata change list indicates to the bridge that // sync is stopping but the data type is not disabled.
diff --git a/components/autofill_assistant/android/BUILD.gn b/components/autofill_assistant/android/BUILD.gn index 19394d5..59c12b9 100644 --- a/components/autofill_assistant/android/BUILD.gn +++ b/components/autofill_assistant/android/BUILD.gn
@@ -18,6 +18,7 @@ ":public_java", "//base:base_java", "//components/autofill/android:autofill_java", + "//components/autofill/android:prefeditor_autofill_java", "//components/autofill_assistant/android:autofill_assistant_public_java", "//components/autofill_assistant/android:java_resources", "//components/browser_ui/bottomsheet/android:java", @@ -53,16 +54,114 @@ ] sources = [ + "java/src/org/chromium/components/autofill_assistant/AbstractListObserver.java", "java/src/org/chromium/components/autofill_assistant/AssistantAccessibilityUtils.java", + "java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java", "java/src/org/chromium/components/autofill_assistant/AssistantBottomBarDelegate.java", + "java/src/org/chromium/components/autofill_assistant/AssistantBottomBarNativeDelegate.java", "java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java", + "java/src/org/chromium/components/autofill_assistant/AssistantCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/AssistantDialogButton.java", + "java/src/org/chromium/components/autofill_assistant/AssistantInfoPopup.java", + "java/src/org/chromium/components/autofill_assistant/AssistantKeyboardCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/AssistantModel.java", + "java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java", + "java/src/org/chromium/components/autofill_assistant/AssistantPeekHeightCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/AssistantRootViewContainer.java", "java/src/org/chromium/components/autofill_assistant/AssistantTagsForTesting.java", "java/src/org/chromium/components/autofill_assistant/AssistantTextUtils.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantClient.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantDependencyInjector.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantDirectActionImpl.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantUiController.java", "java/src/org/chromium/components/autofill_assistant/BottomSheetUtils.java", "java/src/org/chromium/components/autofill_assistant/FeedbackContext.java", "java/src/org/chromium/components/autofill_assistant/LayoutUtils.java", "java/src/org/chromium/components/autofill_assistant/ScrollToHideGestureListener.java", "java/src/org/chromium/components/autofill_assistant/SizeListenableLinearLayout.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsDecoration.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantCarouselModel.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantChip.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipAdapter.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipViewHolder.java", + "java/src/org/chromium/components/autofill_assistant/carousel/ButtonView.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantDetails.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsAdapter.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsModel.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantPlaceholdersConfiguration.java", + "java/src/org/chromium/components/autofill_assistant/details/ImageClickthroughData.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounter.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounterInput.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormDelegate.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormInput.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormModel.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionChoice.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionInput.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantColor.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDimension.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDrawable.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiModel.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantToggleButton.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantValue.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewEvents.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewFactory.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewInteractions.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderDelegate.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderModel.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderViewBinder.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantStepProgressBar.java", + "java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBox.java", + "java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxModel.java", + "java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/BaseOnboardingCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/DialogOnboardingCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingView.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDelegate.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDrawable.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayEventFilter.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayImage.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java", + "java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java", + "java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantChoiceList.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantContactDetailsSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantDateTime.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantInfoSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginChoice.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantPaymentMethodSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantPhoneNumberSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantShippingAddressSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantTermsSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpander.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java", + "java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java", + "java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java", + "java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] @@ -140,6 +239,48 @@ ] } +generate_jni("jni_headers") { + sources = [ + "java/src/org/chromium/components/autofill_assistant/AssistantBottomBarNativeDelegate.java", + "java/src/org/chromium/components/autofill_assistant/AssistantDialogButton.java", + "java/src/org/chromium/components/autofill_assistant/AssistantInfoPopup.java", + "java/src/org/chromium/components/autofill_assistant/AssistantModel.java", + "java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantClient.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantDependencyInjector.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantDirectActionImpl.java", + "java/src/org/chromium/components/autofill_assistant/AutofillAssistantUiController.java", + "java/src/org/chromium/components/autofill_assistant/carousel/AssistantChip.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantDetails.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsModel.java", + "java/src/org/chromium/components/autofill_assistant/details/AssistantPlaceholdersConfiguration.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormDelegate.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormInput.java", + "java/src/org/chromium/components/autofill_assistant/form/AssistantFormModel.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantColor.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDimension.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDrawable.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiModel.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantValue.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewEvents.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewFactory.java", + "java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewInteractions.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderDelegate.java", + "java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderModel.java", + "java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBox.java", + "java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxModel.java", + "java/src/org/chromium/components/autofill_assistant/onboarding/BaseOnboardingCoordinator.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDelegate.java", + "java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java", + "java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantDateTime.java", + ] + split_name = "autofill_assistant" +} + generate_jni("jni_headers_public") { sources = [ "public/java/src/org/chromium/components/autofill_assistant/AssistantAutofillCreditCard.java",
diff --git a/components/autofill_assistant/android/DEPS b/components/autofill_assistant/android/DEPS index b635b27..55eb9d9 100644 --- a/components/autofill_assistant/android/DEPS +++ b/components/autofill_assistant/android/DEPS
@@ -1,5 +1,10 @@ include_rules = [ + "+components/autofill", "+components/browser_ui/bottomsheet", + "+components/browser_ui/modaldialog/android", + "+components/browser_ui/settings/android", + "+components/browser_ui/styles/android", + "+components/browser_ui/widget/android", "+components/favicon", "+components/image_fetcher", "+components/module_installer",
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_bottom_sheet_content.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_bottom_sheet_content.xml index caad6b5..d39980b 100644 --- a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_bottom_sheet_content.xml +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_bottom_sheet_content.xml
@@ -2,7 +2,7 @@ <!-- 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. --> -<org.chromium.chrome.browser.autofill_assistant.AssistantRootViewContainer +<org.chromium.components.autofill_assistant.AssistantRootViewContainer xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/autofill_assistant" android:clickable="true" @@ -26,4 +26,4 @@ android:importantForAccessibility="no" android:clipToPadding="false" /> </org.chromium.components.browser_ui.widget.FadingEdgeScrollView> -</org.chromium.chrome.browser.autofill_assistant.AssistantRootViewContainer> +</org.chromium.components.autofill_assistant.AssistantRootViewContainer>
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_assistive.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_assistive.xml index 8322402d..2c0a26a 100644 --- a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_assistive.xml +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_assistive.xml
@@ -2,7 +2,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. --> -<org.chromium.chrome.browser.autofill_assistant.carousel.ButtonView +<org.chromium.components.autofill_assistant.carousel.ButtonView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content"
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_filled.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_filled.xml index b0e08fd..f0396af5 100644 --- a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_filled.xml +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_filled.xml
@@ -2,7 +2,7 @@ <!-- 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. --> -<org.chromium.chrome.browser.autofill_assistant.carousel.ButtonView +<org.chromium.components.autofill_assistant.carousel.ButtonView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content"
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_hairline.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_hairline.xml index 94f12ab..6c22c02 100644 --- a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_hairline.xml +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_button_hairline.xml
@@ -2,7 +2,7 @@ <!-- 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. --> -<org.chromium.chrome.browser.autofill_assistant.carousel.ButtonView +<org.chromium.components.autofill_assistant.carousel.ButtonView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content"
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_form_selection_input.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_form_selection_input.xml index 83b279d..582273b 100644 --- a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_form_selection_input.xml +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_form_selection_input.xml
@@ -32,7 +32,7 @@ <!-- Default Radiobutton is 32dp big but only has a 24dp big circle. This leaves a 4dp padding that needs to be subtracted from the start. --> - <org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList + <org.chromium.components.autofill_assistant.user_data.AssistantChoiceList android:id="@+id/radiobutton_list" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -42,5 +42,5 @@ app:column_spacing="8dp" android:visibility="gone"> <!-- Choices are created in code. --> - </org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList> + </org.chromium.components.autofill_assistant.user_data.AssistantChoiceList> </LinearLayout>
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_payment_request_terms_and_conditions.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_payment_request_terms_and_conditions.xml index a7bdf19..0b7cd3ef 100644 --- a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_payment_request_terms_and_conditions.xml +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_payment_request_terms_and_conditions.xml
@@ -10,7 +10,7 @@ android:orientation="vertical"> <!-- Third party terms and conditions. --> - <org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList + <org.chromium.components.autofill_assistant.user_data.AssistantChoiceList android:id="@+id/third_party_terms_list" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -19,7 +19,7 @@ app:column_spacing="8dp" app:layout_has_edit_button="false"> <!-- Choices are created in code. --> - </org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList> + </org.chromium.components.autofill_assistant.user_data.AssistantChoiceList> <!-- Privacy notice. --> <TextView
diff --git a/components/autofill_assistant/android/internal/java/src/org/chromium/chrome/browser/autofill_assistant/header/AnimatedPoodle.java b/components/autofill_assistant/android/internal/java/src/org/chromium/chrome/browser/autofill_assistant/header/AnimatedPoodle.java index b752174..f3850f21d 100644 --- a/components/autofill_assistant/android/internal/java/src/org/chromium/chrome/browser/autofill_assistant/header/AnimatedPoodle.java +++ b/components/autofill_assistant/android/internal/java/src/org/chromium/chrome/browser/autofill_assistant/header/AnimatedPoodle.java
@@ -21,7 +21,7 @@ * <p>Warning: do not rename this class or change the signature of the non-private methods * (including constructor) without adapting the associated downstream code. */ -/* package */ class AnimatedPoodle { +public class AnimatedPoodle { private final ImageView mView; /** @@ -29,7 +29,7 @@ * pixels that displays a centered poodle with a width and height of {@code poodleSizePx} * pixels. */ - /* package */ AnimatedPoodle(Context context, int viewSizePx, int poodleSizePx) { + public AnimatedPoodle(Context context, int viewSizePx, int poodleSizePx) { mView = new ImageView(context); mView.setImageDrawable( AppCompatResources.getDrawable(context, R.drawable.ic_autofill_assistant_24dp)); @@ -40,12 +40,12 @@ } /** Get the view associated to this animated poodle. */ - /* package */ View getView() { + public View getView() { return mView; } /** Enable or disable the spin animation. */ - /* package */ void setSpinEnabled(boolean enabled) { + public void setSpinEnabled(boolean enabled) { // Do nothing. } }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AbstractListObserver.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AbstractListObserver.java similarity index 94% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AbstractListObserver.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AbstractListObserver.java index 2d14efe..c118e84 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AbstractListObserver.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AbstractListObserver.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import androidx.annotation.Nullable;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java similarity index 91% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java index 219ab63..a2d1fba 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.app.Activity; import android.transition.ChangeBounds; @@ -20,31 +20,19 @@ import org.chromium.base.Callback; import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.task.PostTask; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsCoordinator; -import org.chromium.chrome.browser.autofill_assistant.form.AssistantFormCoordinator; -import org.chromium.chrome.browser.autofill_assistant.form.AssistantFormModel; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantGenericUiCoordinator; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantGenericUiModel; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxCoordinator; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel; -import org.chromium.components.autofill_assistant.AssistantBottomBarDelegate; -import org.chromium.components.autofill_assistant.AssistantBottomSheetContent; -import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; -import org.chromium.components.autofill_assistant.AssistantEditorFactory; -import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; -import org.chromium.components.autofill_assistant.AssistantProfileImageUtil; -import org.chromium.components.autofill_assistant.AssistantSettingsUtil; -import org.chromium.components.autofill_assistant.AssistantTabObscuringUtil; -import org.chromium.components.autofill_assistant.AssistantTagsForTesting; -import org.chromium.components.autofill_assistant.BottomSheetUtils; -import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.carousel.AssistantActionsCarouselCoordinator; +import org.chromium.components.autofill_assistant.carousel.AssistantCarouselModel; +import org.chromium.components.autofill_assistant.details.AssistantDetailsCoordinator; +import org.chromium.components.autofill_assistant.form.AssistantFormCoordinator; +import org.chromium.components.autofill_assistant.form.AssistantFormModel; +import org.chromium.components.autofill_assistant.generic_ui.AssistantGenericUiCoordinator; +import org.chromium.components.autofill_assistant.generic_ui.AssistantGenericUiModel; +import org.chromium.components.autofill_assistant.header.AssistantHeaderCoordinator; +import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxCoordinator; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarNativeDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarNativeDelegate.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarNativeDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarNativeDelegate.java index 731081c..d04909e 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarNativeDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarNativeDelegate.java
@@ -2,12 +2,11 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.components.autofill_assistant.AssistantBottomBarDelegate; /** Delegate for the bottom bar which forwards events to a native counterpart. */ @JNINamespace("autofill_assistant")
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantCoordinator.java similarity index 84% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantCoordinator.java index fe8dac4..685d063 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.app.Activity; import android.view.View; @@ -10,13 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; -import org.chromium.components.autofill_assistant.AssistantEditorFactory; -import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; -import org.chromium.components.autofill_assistant.AssistantProfileImageUtil; -import org.chromium.components.autofill_assistant.AssistantSettingsUtil; -import org.chromium.components.autofill_assistant.AssistantTabObscuringUtil; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState; import org.chromium.components.image_fetcher.ImageFetcher; @@ -35,7 +29,7 @@ private final AssistantKeyboardCoordinator mKeyboardCoordinator; private final AssistantOverlayCoordinator mOverlayCoordinator; - AssistantCoordinator(Activity activity, BottomSheetController controller, + public AssistantCoordinator(Activity activity, BottomSheetController controller, @Nullable AssistantTabObscuringUtil tabObscuringUtil, @Nullable AssistantOverlayCoordinator overlayCoordinator, AssistantKeyboardCoordinator.Delegate keyboardCoordinatorDelegate,
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDialogButton.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantDialogButton.java similarity index 88% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDialogButton.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantDialogButton.java index 18e043d..32852c0 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantDialogButton.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantDialogButton.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.content.Context; @@ -10,7 +10,6 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; /** * Represents a button.
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantInfoPopup.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantInfoPopup.java similarity index 92% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantInfoPopup.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantInfoPopup.java index dfb5cb0..5f35aac 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantInfoPopup.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantInfoPopup.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.content.Context; @@ -50,8 +50,8 @@ public void show(Context context) { AlertDialog.Builder builder = new AlertDialog .Builder(context, - org.chromium.chrome.autofill_assistant.R.style - .Theme_Chromium_AlertDialog) + org.chromium.components.autofill_assistant.R + .style.Theme_Chromium_AlertDialog) .setTitle(mTitle) .setMessage(mText);
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantKeyboardCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantKeyboardCoordinator.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantKeyboardCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantKeyboardCoordinator.java index 2725812..78253c1 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantKeyboardCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantKeyboardCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.app.Activity; import android.view.View;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java similarity index 84% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java index da5acdc..7d9a7d8 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java
@@ -2,19 +2,18 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel; -import org.chromium.chrome.browser.autofill_assistant.details.AssistantDetailsModel; -import org.chromium.chrome.browser.autofill_assistant.form.AssistantFormModel; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantGenericUiModel; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxModel; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel; -import org.chromium.components.autofill_assistant.AssistantBottomBarDelegate; +import org.chromium.components.autofill_assistant.carousel.AssistantCarouselModel; +import org.chromium.components.autofill_assistant.details.AssistantDetailsModel; +import org.chromium.components.autofill_assistant.form.AssistantFormModel; +import org.chromium.components.autofill_assistant.generic_ui.AssistantGenericUiModel; +import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxModel; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.modelutil.PropertyModel; @@ -22,7 +21,7 @@ * State for the Autofill Assistant UI. */ @JNINamespace("autofill_assistant") -class AssistantModel extends PropertyModel { +public class AssistantModel extends PropertyModel { static final WritableBooleanPropertyKey ALLOW_SOFT_KEYBOARD = new WritableBooleanPropertyKey(); static final WritableBooleanPropertyKey ALLOW_TALKBACK_ON_WEBSITE = new WritableBooleanPropertyKey();
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java similarity index 83% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperImpl.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java index d16430e7..e2d2aa70 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperImpl.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java
@@ -2,20 +2,18 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import androidx.annotation.Nullable; import org.chromium.base.Callback; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.onboarding.AssistantOnboardingResult; -import org.chromium.chrome.browser.autofill_assistant.onboarding.BaseOnboardingCoordinator; -import org.chromium.chrome.browser.autofill_assistant.onboarding.OnboardingCoordinatorFactory; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.chrome.browser.autofill_assistant.trigger_scripts.AssistantTriggerScriptBridge; -import org.chromium.components.autofill_assistant.AssistantDependencies; -import org.chromium.components.autofill_assistant.AssistantOnboardingHelper; +import org.chromium.components.autofill_assistant.onboarding.AssistantOnboardingResult; +import org.chromium.components.autofill_assistant.onboarding.BaseOnboardingCoordinator; +import org.chromium.components.autofill_assistant.onboarding.OnboardingCoordinatorFactory; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; +import org.chromium.components.autofill_assistant.trigger_scripts.AssistantTriggerScriptBridge; import org.chromium.content_public.browser.WebContents; import java.util.Map;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPeekHeightCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantPeekHeightCoordinator.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPeekHeightCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantPeekHeightCoordinator.java index 18ccff1..d3d6477 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantPeekHeightCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantPeekHeightCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.content.Context; import android.view.View; @@ -11,7 +11,6 @@ import org.chromium.base.Callback; import org.chromium.base.task.PostTask; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver; import org.chromium.content_public.browser.UiThreadTaskTraits;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantRootViewContainer.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantRootViewContainer.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantRootViewContainer.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantRootViewContainer.java index 6ca3d87..1651d8ac 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantRootViewContainer.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantRootViewContainer.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.app.Activity; import android.content.Context; @@ -14,8 +14,6 @@ import androidx.annotation.Nullable; import org.chromium.base.ContextUtils; -import org.chromium.components.autofill_assistant.AssistantBrowserControls; -import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; import org.chromium.ui.util.AccessibilityUtil; /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java similarity index 86% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java index c2bcae9..d929c1a 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.app.Activity; import android.os.Bundle; @@ -12,14 +12,10 @@ import org.chromium.base.Callback; import org.chromium.base.ThreadUtils; import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.browser.autofill_assistant.onboarding.AssistantOnboardingResult; -import org.chromium.chrome.browser.autofill_assistant.onboarding.BaseOnboardingCoordinator; -import org.chromium.chrome.browser.autofill_assistant.onboarding.OnboardingCoordinatorFactory; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.components.autofill_assistant.AssistantStaticDependencies; -import org.chromium.components.autofill_assistant.AutofillAssistantActionHandler; -import org.chromium.components.autofill_assistant.AutofillAssistantDirectAction; -import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.onboarding.AssistantOnboardingResult; +import org.chromium.components.autofill_assistant.onboarding.BaseOnboardingCoordinator; +import org.chromium.components.autofill_assistant.onboarding.OnboardingCoordinatorFactory; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; @@ -31,12 +27,13 @@ /** * A handler that provides Autofill Assistant actions for a specific activity. */ -class AutofillAssistantActionHandlerImpl implements AutofillAssistantActionHandler { +public class AutofillAssistantActionHandlerImpl implements AutofillAssistantActionHandler { private final OnboardingCoordinatorFactory mOnboardingCoordinatorFactory; private final AssistantStaticDependencies mStaticDependencies; private final Supplier<WebContents> mWebContentsSupplier; - AutofillAssistantActionHandlerImpl(OnboardingCoordinatorFactory onboardingCoordinatorFactory, + public AutofillAssistantActionHandlerImpl( + OnboardingCoordinatorFactory onboardingCoordinatorFactory, Supplier<WebContents> webContentsSupplier, AssistantStaticDependencies staticDependencies) { mOnboardingCoordinatorFactory = onboardingCoordinatorFactory;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantClient.java similarity index 92% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantClient.java index d566ea4..67b97de0 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantClient.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.accessibilityservice.AccessibilityServiceInfo; import android.accounts.Account; @@ -16,11 +16,8 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.chrome.browser.autofill_assistant.user_data.GmsIntegrator; -import org.chromium.components.autofill_assistant.AssistantAccessTokenUtil; -import org.chromium.components.autofill_assistant.AssistantDependencies; -import org.chromium.components.autofill_assistant.AutofillAssistantDirectAction; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.components.signin.AccessTokenData; import org.chromium.components.signin.AccountManagerFacadeProvider; import org.chromium.components.signin.identitymanager.IdentityManager; @@ -286,24 +283,23 @@ return; } - mAccessTokenUtil.getAccessToken( - mAccount, new IdentityManager.GetAccessTokenCallback() { - @Override - public void onGetTokenSuccess(AccessTokenData token) { - if (mNativeClientAndroid != 0) { - AutofillAssistantClientJni.get().onAccessToken(mNativeClientAndroid, - AutofillAssistantClient.this, true, token.getToken()); - } - } + mAccessTokenUtil.getAccessToken(mAccount, new IdentityManager.GetAccessTokenCallback() { + @Override + public void onGetTokenSuccess(AccessTokenData token) { + if (mNativeClientAndroid != 0) { + AutofillAssistantClientJni.get().onAccessToken(mNativeClientAndroid, + AutofillAssistantClient.this, true, token.getToken()); + } + } - @Override - public void onGetTokenFailure(boolean isTransientError) { - if (!isTransientError && mNativeClientAndroid != 0) { - AutofillAssistantClientJni.get().onAccessToken( - mNativeClientAndroid, AutofillAssistantClient.this, false, ""); - } - } - }); + @Override + public void onGetTokenFailure(boolean isTransientError) { + if (!isTransientError && mNativeClientAndroid != 0) { + AutofillAssistantClientJni.get().onAccessToken( + mNativeClientAndroid, AutofillAssistantClient.this, false, ""); + } + } + }); } @CalledByNative
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDependencyInjector.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantDependencyInjector.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDependencyInjector.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantDependencyInjector.java index 77caede..548259cb 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDependencyInjector.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantDependencyInjector.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantDirectActionImpl.java similarity index 85% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionImpl.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantDirectActionImpl.java index 3f8c715..d6d8c41 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionImpl.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantDirectActionImpl.java
@@ -2,11 +2,10 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.components.autofill_assistant.AutofillAssistantDirectAction; import java.util.Arrays; import java.util.List; @@ -16,7 +15,7 @@ * arguments. */ @JNINamespace("autofill_assistant") -class AutofillAssistantDirectActionImpl implements AutofillAssistantDirectAction { +public class AutofillAssistantDirectActionImpl implements AutofillAssistantDirectAction { /* List of direct actions with the given names. */ private final List<String> mNames;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantModuleEntryImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java similarity index 73% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantModuleEntryImpl.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java index b1ce426..58b81a8 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantModuleEntryImpl.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java
@@ -2,20 +2,14 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.content.Context; import android.view.View; import org.chromium.base.annotations.UsedByReflection; import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.browser.autofill_assistant.onboarding.OnboardingCoordinatorFactory; -import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; -import org.chromium.components.autofill_assistant.AssistantDependencies; -import org.chromium.components.autofill_assistant.AssistantOnboardingHelper; -import org.chromium.components.autofill_assistant.AssistantStaticDependencies; -import org.chromium.components.autofill_assistant.AutofillAssistantActionHandler; -import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntry; +import org.chromium.components.autofill_assistant.onboarding.OnboardingCoordinatorFactory; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantUiController.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantUiController.java index bba1c50..5ce2304 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantUiController.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant; +package org.chromium.components.autofill_assistant; import android.app.Activity; import android.content.Context; @@ -14,16 +14,9 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.base.lifetime.Destroyable; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.components.autofill_assistant.AssistantDependencies; -import org.chromium.components.autofill_assistant.AssistantFeedbackUtil; -import org.chromium.components.autofill_assistant.AssistantSnackbar; -import org.chromium.components.autofill_assistant.AssistantSnackbarFactory; -import org.chromium.components.autofill_assistant.AssistantTabChangeObserver; -import org.chromium.components.autofill_assistant.AssistantTabObscuringUtil; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; import org.chromium.components.autofill_assistant.metrics.DropOutReason; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java index 9b63bbb..23f0a6b 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsCarouselCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import static org.chromium.components.autofill_assistant.AssistantTagsForTesting.RECYCLER_VIEW_TAG; @@ -14,7 +14,7 @@ import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; -import org.chromium.chrome.autofill_assistant.R; +import org.chromium.components.autofill_assistant.R; /** * A coordinator responsible for suggesting chips to the user. If there is one chip to display, it
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsDecoration.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsDecoration.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsDecoration.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsDecoration.java index 2177ee38..bc8eb798 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantActionsDecoration.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantActionsDecoration.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import android.content.Context; import android.graphics.Canvas; @@ -15,11 +15,12 @@ import android.view.View; import androidx.annotation.NonNull; +import androidx.appcompat.content.res.AppCompatResources; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.autofill_assistant.R; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.styles.SemanticColorUtils; /** @@ -82,7 +83,8 @@ mShadowLayerWidth = context.getResources().getDimension(R.dimen.autofill_assistant_actions_shadow_width) / SHADOW_LAYERS; - mGradientDrawable = context.getDrawable(R.drawable.autofill_assistant_actions_gradient); + mGradientDrawable = AppCompatResources.getDrawable( + context, R.drawable.autofill_assistant_actions_gradient); mShadowPaint.setAntiAlias(true); mShadowPaint.setDither(true);
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantCarouselModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantCarouselModel.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantCarouselModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantCarouselModel.java index 8fac724..e94e59b 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantCarouselModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantCarouselModel.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChip.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChip.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChip.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChip.java index 15045cd7..a391a5b 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChip.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChip.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -37,7 +37,7 @@ * enum in //components/autofill_assistant/browser/model.proto. DO NOT change this without * adapting that proto enum. */ - @IntDef({Icon.NONE, Icon.CLEAR, Icon.DONE, Icon.REFRESH}) + @IntDef({Icon.NONE, Icon.CLEAR, Icon.DONE, Icon.REFRESH, Icon.OVERFLOW}) @Retention(RetentionPolicy.SOURCE) public @interface Icon { int NONE = 0;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipAdapter.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipAdapter.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipAdapter.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipAdapter.java index f449346..d4205797 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipAdapter.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipAdapter.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import android.view.View; import android.view.ViewGroup;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipViewHolder.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipViewHolder.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipViewHolder.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipViewHolder.java index ba582c7b..c61a426 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/AssistantChipViewHolder.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/AssistantChipViewHolder.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import android.view.LayoutInflater; import android.view.Menu; @@ -13,8 +13,8 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView.ViewHolder; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; /** * The {@link ViewHolder} responsible for reflecting an {@link AssistantChip} to a {@link
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/ButtonView.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/ButtonView.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/ButtonView.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/ButtonView.java index ae0eefe..6ca1f0fb 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/carousel/ButtonView.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/carousel/ButtonView.java
@@ -1,7 +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. -package org.chromium.chrome.browser.autofill_assistant.carousel; +package org.chromium.components.autofill_assistant.carousel; import android.content.Context; import android.content.res.TypedArray; @@ -22,7 +22,7 @@ import androidx.core.view.ViewCompat; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.autofill_assistant.R; +import org.chromium.components.autofill_assistant.R; import org.chromium.ui.base.ViewUtils; import org.chromium.ui.widget.ChromeImageView; import org.chromium.ui.widget.RippleBackgroundHelper;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetails.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetails.java index 9dee6f73..65d9dcb 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetails.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.details; +package org.chromium.components.autofill_assistant.details; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsAdapter.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsAdapter.java similarity index 99% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsAdapter.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsAdapter.java index effa2f3e..f4e19b9 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsAdapter.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsAdapter.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.details; +package org.chromium.components.autofill_assistant.details; import static org.chromium.components.autofill_assistant.AssistantAccessibilityUtils.setAccessibility; @@ -34,10 +34,10 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.components.image_fetcher.ImageFetcher;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsCoordinator.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsCoordinator.java index 397a312..4037b64bb 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.details; +package org.chromium.components.autofill_assistant.details; import android.content.Context; import android.graphics.Canvas; @@ -16,8 +16,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.image_fetcher.ImageFetcher; /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsModel.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsModel.java index a89f546..a93ddd5d 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantDetailsModel.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.details; +package org.chromium.components.autofill_assistant.details; import android.support.annotation.VisibleForTesting;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantPlaceholdersConfiguration.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantPlaceholdersConfiguration.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantPlaceholdersConfiguration.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantPlaceholdersConfiguration.java index 96dce445..2f669cf 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantPlaceholdersConfiguration.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/AssistantPlaceholdersConfiguration.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.details; +package org.chromium.components.autofill_assistant.details; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/ImageClickthroughData.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/ImageClickthroughData.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/ImageClickthroughData.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/ImageClickthroughData.java index a3b2fa2..7afc0dd 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/ImageClickthroughData.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/details/ImageClickthroughData.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.details; +package org.chromium.components.autofill_assistant.details; /** * Holds information controlling whether to show image clickthrough dialog and
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCoordinator.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCoordinator.java index bcadfc1f..2d92935d 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; import android.content.Context; import android.view.View; @@ -10,9 +10,9 @@ import android.widget.LinearLayout; import android.widget.TextView; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; /** * A coordinator responsible for showing a form to the user.
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounter.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounter.java index dd09b27..88bc0f8 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounter.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; abstract class AssistantFormCounter { private final String mLabel;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounterInput.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounterInput.java index 3eb4dd01..2475c0f 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormCounterInput.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; import android.content.Context; import android.transition.ChangeBounds; @@ -14,10 +14,10 @@ import android.view.ViewGroup; import android.widget.TextView; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantStaticDependencies; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.List;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormDelegate.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormDelegate.java index c8d5b8e8..3a14a2e 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormDelegate.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormInput.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormInput.java index 37c9c2e0..3ee2a241 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormInput.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; import android.content.Context; import android.view.View; @@ -11,8 +11,8 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantStaticDependencies; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.List;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormModel.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormModel.java index 8e5c2e2..e139440 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormModel.java
@@ -2,11 +2,11 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.AssistantInfoPopup; +import org.chromium.components.autofill_assistant.AssistantInfoPopup; import org.chromium.ui.modelutil.PropertyModel; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionChoice.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionChoice.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionChoice.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionChoice.java index 3a3907cc..f3fe3f9 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionChoice.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionChoice.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; class AssistantFormSelectionChoice { private final String mLabel;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionInput.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionInput.java similarity index 94% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionInput.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionInput.java index ea2111ec..6e5e924 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormSelectionInput.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/form/AssistantFormSelectionInput.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.form; +package org.chromium.components.autofill_assistant.form; import android.content.Context; import android.view.LayoutInflater; @@ -11,10 +11,10 @@ import android.widget.CheckBox; import android.widget.TextView; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantChoiceList; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.user_data.AssistantChoiceList; import java.util.ArrayList; import java.util.List; @@ -46,7 +46,7 @@ ViewGroup root = (ViewGroup) inflater.inflate( R.layout.autofill_assistant_form_selection_input, parent, /* attachToRoot= */ false); - TextView label = root.findViewById(org.chromium.chrome.autofill_assistant.R.id.label); + TextView label = root.findViewById(org.chromium.components.autofill_assistant.R.id.label); if (mLabel.isEmpty()) { label.setVisibility(View.GONE); } else {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantColor.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantColor.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantColor.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantColor.java index 0a6d157..1dbc326 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantColor.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantColor.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.content.Context; import android.content.res.Resources;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDimension.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDimension.java similarity index 94% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDimension.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDimension.java index 62700f96..ab52f9b 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDimension.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDimension.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.content.Context; import android.util.TypedValue;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDrawable.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDrawable.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDrawable.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDrawable.java index 16ba72a..3e100d0 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantDrawable.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantDrawable.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.content.Context; import android.content.res.Resources; @@ -20,8 +20,8 @@ import org.chromium.base.Callback; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.drawable.AssistantDrawableIcon; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.drawable.AssistantDrawableIcon; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.favicon.LargeIconBridge; import org.chromium.components.image_fetcher.ImageFetcher; @@ -130,16 +130,15 @@ // TODO(b/143517837) Merge autofill assistant image fetcher UMA names. ImageFetcher.Params params = ImageFetcher.Params.create( mUrl, ImageFetcher.ASSISTANT_DETAILS_UMA_CLIENT_NAME); - mImageFetcher.fetchImage( - params, result -> { - if (result != null) { - callback.onResult(new BitmapDrawable(context.getResources(), - Bitmap.createScaledBitmap( - result, mWidthInPixels, mHeightInPixels, true))); - } else { - callback.onResult(null); - } - }); + mImageFetcher.fetchImage(params, result -> { + if (result != null) { + callback.onResult(new BitmapDrawable(context.getResources(), + Bitmap.createScaledBitmap( + result, mWidthInPixels, mHeightInPixels, true))); + } else { + callback.onResult(null); + } + }); } }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java similarity index 85% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java index 229dca6..dc501e8 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiCoordinator.java
@@ -2,14 +2,14 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantGenericUiViewBinder.ViewHolder; +import org.chromium.components.autofill_assistant.generic_ui.AssistantGenericUiViewBinder.ViewHolder; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java index fbad6014..d42919a2 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiDelegate.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiModel.java similarity index 92% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiModel.java index 6c3cbb9..20f4840 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiModel.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.view.View;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java index c84694d..12b4aeba 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantGenericUiViewBinder.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.view.View; import android.view.ViewGroup;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantToggleButton.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantToggleButton.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantToggleButton.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantToggleButton.java index ddbdb35..a28d8fd2 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantToggleButton.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantToggleButton.java
@@ -2,9 +2,9 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; -import static org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantViewFactory.setViewLayoutParams; +import static org.chromium.components.autofill_assistant.generic_ui.AssistantViewFactory.setViewLayoutParams; import android.content.Context; import android.support.annotation.Nullable;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantValue.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantValue.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantValue.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantValue.java index 2fc5ada5..47360d26 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantValue.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantValue.java
@@ -2,13 +2,13 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import androidx.annotation.Nullable; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantDateTime; +import org.chromium.components.autofill_assistant.user_data.AssistantDateTime; import java.util.ArrayList; import java.util.Arrays;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewEvents.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewEvents.java similarity index 90% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewEvents.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewEvents.java index 15da5b8..0b6a687 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewEvents.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewEvents.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import android.view.View;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewFactory.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewFactory.java index b081645..1c85cb5 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewFactory.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; import static org.chromium.components.autofill_assistant.AssistantAccessibilityUtils.setAccessibility; @@ -20,13 +20,13 @@ import org.chromium.base.Log; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.AssistantChevronStyle; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantVerticalExpander; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantVerticalExpanderAccordion; import org.chromium.components.autofill.prefeditor.EditorFieldModel; import org.chromium.components.autofill.prefeditor.EditorTextField; +import org.chromium.components.autofill_assistant.AssistantChevronStyle; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.user_data.AssistantVerticalExpander; +import org.chromium.components.autofill_assistant.user_data.AssistantVerticalExpanderAccordion; import org.chromium.ui.widget.ChromeImageView; /** Generic view factory. */ @@ -134,7 +134,7 @@ @CalledByNative public static View createDividerView(Context context, String identifier) { View divider = LayoutUtils.createInflater(context).inflate( - org.chromium.chrome.autofill_assistant.R.layout + org.chromium.components.autofill_assistant.R.layout .autofill_assistant_payment_request_section_divider, null, false); divider.setTag(identifier);
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewInteractions.java similarity index 94% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewInteractions.java index cc299af4d..2aed4ec 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/generic_ui/AssistantViewInteractions.java
@@ -2,9 +2,9 @@ // 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.autofill_assistant.generic_ui; +package org.chromium.components.autofill_assistant.generic_ui; -import static org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue.isDateSingleton; +import static org.chromium.components.autofill_assistant.generic_ui.AssistantValue.isDateSingleton; import android.content.Context; import android.text.TextUtils; @@ -17,9 +17,9 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantDateTime; import org.chromium.components.autofill.prefeditor.EditorTextField; import org.chromium.components.autofill_assistant.AssistantTextUtils; +import org.chromium.components.autofill_assistant.user_data.AssistantDateTime; import org.chromium.content.browser.input.PopupItemType; import org.chromium.content.browser.input.SelectPopupDialog; import org.chromium.content.browser.input.SelectPopupItem; @@ -150,7 +150,8 @@ AssistantGenericUiDelegate delegate, String popupIdentifier) { new AlertDialog .Builder(context, - org.chromium.chrome.autofill_assistant.R.style.Theme_Chromium_AlertDialog) + org.chromium.components.autofill_assistant.R.style + .Theme_Chromium_AlertDialog) .setView(contentView) .setOnDismissListener(unused -> delegate.onGenericPopupDismissed(popupIdentifier)) .show();
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderCoordinator.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderCoordinator.java index 7b22bef..a27c393 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.header; +package org.chromium.components.autofill_assistant.header; import android.content.Context; import android.graphics.Rect; @@ -16,12 +16,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipAdapter; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderViewBinder.ViewHolder; +import org.chromium.chrome.browser.autofill_assistant.header.AnimatedPoodle; import org.chromium.components.autofill_assistant.AssistantProfileImageUtil; import org.chromium.components.autofill_assistant.AssistantSettingsUtil; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.carousel.AssistantChipAdapter; +import org.chromium.components.autofill_assistant.header.AssistantHeaderViewBinder.ViewHolder; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import org.chromium.ui.util.AccessibilityUtil;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderDelegate.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderDelegate.java index 8ae1c7b4..402acba 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderDelegate.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.header; +package org.chromium.components.autofill_assistant.header; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderModel.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderModel.java index 6741de29..73dd943 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderModel.java
@@ -2,14 +2,14 @@ // 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.autofill_assistant.header; +package org.chromium.components.autofill_assistant.header; import android.support.annotation.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDrawable; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; +import org.chromium.components.autofill_assistant.generic_ui.AssistantDrawable; import org.chromium.ui.modelutil.PropertyModel; import java.util.ArrayList;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderViewBinder.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderViewBinder.java index 2eafdf97..e4caff68 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantHeaderViewBinder.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.header; +package org.chromium.components.autofill_assistant.header; import android.content.Context; import android.view.MenuItem; @@ -17,11 +17,12 @@ import androidx.recyclerview.widget.RecyclerView; import org.chromium.base.task.PostTask; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipAdapter; +import org.chromium.chrome.browser.autofill_assistant.header.AnimatedPoodle; import org.chromium.components.autofill_assistant.AssistantSettingsUtil; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; import org.chromium.components.autofill_assistant.AssistantTextUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.carousel.AssistantChipAdapter; import org.chromium.components.browser_ui.widget.textbubble.TextBubble; import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.ui.modelutil.PropertyKey;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantStepProgressBar.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantStepProgressBar.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantStepProgressBar.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantStepProgressBar.java index e3bd7ee0..6f82d9d7 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantStepProgressBar.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/header/AssistantStepProgressBar.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.header; +package org.chromium.components.autofill_assistant.header; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -17,10 +17,10 @@ import androidx.core.content.ContextCompat; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.drawable.AssistantDrawableIcon; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDrawable; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.drawable.AssistantDrawableIcon; +import org.chromium.components.autofill_assistant.generic_ui.AssistantDrawable; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.ui.widget.ChromeImageView; @@ -45,7 +45,6 @@ private static final int ERROR_COLOR_LIST = R.color.default_red; private static class IconViewHolder { - private final RelativeLayout mView; private final Context mContext; private final View mPulsor;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBox.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBox.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBox.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBox.java index f3772c24..0e6ad399 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBox.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBox.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.infobox; +package org.chromium.components.autofill_assistant.infobox; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java similarity index 91% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java index 5bb3081..42e25dbe 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxCoordinator.java
@@ -2,14 +2,14 @@ // 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.autofill_assistant.infobox; +package org.chromium.components.autofill_assistant.infobox; import android.content.Context; import android.view.View; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxViewBinder.ViewHolder; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.infobox.AssistantInfoBoxViewBinder.ViewHolder; import org.chromium.components.image_fetcher.ImageFetcher; import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxModel.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxModel.java index 90157a01..0ce3f1a 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxModel.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.infobox; +package org.chromium.components.autofill_assistant.infobox; import androidx.annotation.VisibleForTesting;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java index 092c964a..f855189c 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/infobox/AssistantInfoBoxViewBinder.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.infobox; +package org.chromium.components.autofill_assistant.infobox; import android.content.Context; import android.graphics.drawable.BitmapDrawable; @@ -10,8 +10,8 @@ import android.view.View; import android.widget.TextView; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantTextUtils; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.image_fetcher.ImageFetcher; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BaseOnboardingCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BaseOnboardingCoordinator.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BaseOnboardingCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BaseOnboardingCoordinator.java index 47618f49..ebdfe37 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BaseOnboardingCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BaseOnboardingCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import android.content.Context; import android.text.SpannableString; @@ -19,10 +19,10 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; import org.chromium.components.embedder_support.util.UrlUtilitiesJni; import org.chromium.content_public.browser.BrowserContextHandle; import org.chromium.ui.text.NoUnderlineClickableSpan;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java index 7392159..0275f8e 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import android.content.Context; import android.view.Gravity; @@ -16,16 +16,16 @@ import androidx.annotation.Nullable; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayCoordinator; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.components.autofill_assistant.AssistantBottomBarDelegate; import org.chromium.components.autofill_assistant.AssistantBottomSheetContent; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; import org.chromium.components.autofill_assistant.BottomSheetUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayState; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java index a7c3e99..de1d54e2 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupAndBubbleCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import android.content.Context; import android.view.View; @@ -11,10 +11,10 @@ import androidx.annotation.Nullable; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDimension; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.generic_ui.AssistantDimension; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.browser_ui.widget.textbubble.TextBubble;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java index 1d82993..554bdf99 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingWithPopupCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import android.content.Context; import android.content.DialogInterface; @@ -15,9 +15,9 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.content_public.browser.BrowserContextHandle;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/DialogOnboardingCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/DialogOnboardingCoordinator.java similarity index 94% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/DialogOnboardingCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/DialogOnboardingCoordinator.java index 500b52d..3fbe513 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/DialogOnboardingCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/DialogOnboardingCoordinator.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import android.content.Context; import android.content.DialogInterface.OnDismissListener; @@ -16,9 +16,9 @@ import androidx.appcompat.app.AlertDialog; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantInfoPageUtil; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; import org.chromium.content_public.browser.BrowserContextHandle; import java.util.Map; @@ -62,7 +62,7 @@ void initViewImpl(Callback<Integer> callback) { mDialog = new AlertDialog .Builder(getContext(), - org.chromium.chrome.autofill_assistant.R.style + org.chromium.components.autofill_assistant.R.style .Theme_Chromium_AlertDialog) .create();
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java index 7c04f4f..0b24b17 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingCoordinatorFactory.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import android.content.Context; import android.view.View;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingView.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingView.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingView.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingView.java index 28dcdd9..4217753 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/onboarding/OnboardingView.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/OnboardingView.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.onboarding; +package org.chromium.components.autofill_assistant.onboarding; import org.chromium.base.Callback;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java index c5b17c4..1d58afc 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java
@@ -2,14 +2,14 @@ // 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.autofill_assistant.overlay; +package org.chromium.components.autofill_assistant.overlay; import android.content.Context; import android.graphics.RectF; import android.view.View; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDelegate.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDelegate.java index 84b465e..d5a25d279 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDelegate.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.overlay; +package org.chromium.components.autofill_assistant.overlay; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDrawable.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDrawable.java index cce1434..67449d4f 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayDrawable.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayDrawable.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.overlay; +package org.chromium.components.autofill_assistant.overlay; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -30,10 +30,10 @@ import androidx.annotation.Nullable; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; import org.chromium.components.autofill_assistant.AssistantBrowserControls; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; import org.chromium.content.browser.RenderCoordinatesImpl; import org.chromium.content_public.browser.GestureListenerManager; import org.chromium.content_public.browser.GestureStateListenerWithScroll;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayEventFilter.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayEventFilter.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayEventFilter.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayEventFilter.java index 289cd6c..6015d7f 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayEventFilter.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayEventFilter.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.overlay; +package org.chromium.components.autofill_assistant.overlay; import android.content.Context; import android.graphics.RectF; @@ -13,9 +13,9 @@ import androidx.annotation.IntDef; import androidx.annotation.NonNull; -import org.chromium.chrome.browser.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; import org.chromium.components.autofill_assistant.AssistantBrowserControls; import org.chromium.components.autofill_assistant.AssistantBrowserControlsFactory; +import org.chromium.components.autofill_assistant.overlay.AssistantOverlayModel.AssistantOverlayRect; import org.chromium.content.browser.RenderCoordinatesImpl; import org.chromium.content_public.browser.GestureListenerManager; import org.chromium.content_public.browser.GestureStateListenerWithScroll;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayImage.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayImage.java index 403fb213..6d1c7e6 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayImage.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayImage.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.overlay; +package org.chromium.components.autofill_assistant.overlay; import android.graphics.drawable.Drawable;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java index 9ad1f12..71f22aa 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/overlay/AssistantOverlayModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayModel.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.overlay; +package org.chromium.components.autofill_assistant.overlay; import android.content.Context; import android.graphics.Rect; @@ -14,7 +14,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDrawable; +import org.chromium.components.autofill_assistant.generic_ui.AssistantDrawable; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScript.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScript.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java index 211a3c0..a00d7938 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScript.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.trigger_scripts; +package org.chromium.components.autofill_assistant.trigger_scripts; import android.content.Context; import android.view.ViewGroup; @@ -14,21 +14,21 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.AssistantRootViewContainer; -import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantDependencyInjector; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipViewHolder; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDimension; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; import org.chromium.components.autofill_assistant.AssistantBottomBarDelegate; import org.chromium.components.autofill_assistant.AssistantBottomSheetContent; import org.chromium.components.autofill_assistant.AssistantProfileImageUtil; +import org.chromium.components.autofill_assistant.AssistantRootViewContainer; import org.chromium.components.autofill_assistant.AssistantSettingsUtil; +import org.chromium.components.autofill_assistant.AutofillAssistantDependencyInjector; import org.chromium.components.autofill_assistant.BottomSheetUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.autofill_assistant.ScrollToHideGestureListener; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; +import org.chromium.components.autofill_assistant.carousel.AssistantChipViewHolder; +import org.chromium.components.autofill_assistant.generic_ui.AssistantDimension; +import org.chromium.components.autofill_assistant.header.AssistantHeaderCoordinator; +import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java similarity index 84% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java index 4fa07ca..d03d7b95 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.trigger_scripts; +package org.chromium.components.autofill_assistant.trigger_scripts; import android.app.Activity; import android.content.Context; @@ -12,10 +12,10 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip; -import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; import org.chromium.components.autofill_assistant.AssistantDependencies; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.carousel.AssistantChip; +import org.chromium.components.autofill_assistant.header.AssistantHeaderModel; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.base.WindowAndroid; @@ -41,29 +41,28 @@ mWebContents = webContents; mDependencies = dependencies; - AssistantTriggerScript.Delegate delegate = - new AssistantTriggerScript.Delegate() { - @Override - public void onTriggerScriptAction(int action) { - safeNativeOnTriggerScriptAction(action); - } + AssistantTriggerScript.Delegate delegate = new AssistantTriggerScript.Delegate() { + @Override + public void onTriggerScriptAction(int action) { + safeNativeOnTriggerScriptAction(action); + } - @Override - public void onBottomSheetClosedWithSwipe() { - safeNativeOnBottomSheetClosedWithSwipe(); - } + @Override + public void onBottomSheetClosedWithSwipe() { + safeNativeOnBottomSheetClosedWithSwipe(); + } - @Override - public boolean onBackButtonPressed() { - return safeNativeOnBackButtonPressed(); - } + @Override + public boolean onBackButtonPressed() { + return safeNativeOnBackButtonPressed(); + } - @Override - public void onFeedbackButtonClicked() { - dependencies.createFeedbackUtil().showFeedback(dependencies.getActivity(), - webContents, /* screenshotMode= */ 0, /* debugContext= */ null); - } - }; + @Override + public void onFeedbackButtonClicked() { + dependencies.createFeedbackUtil().showFeedback(dependencies.getActivity(), + webContents, /* screenshotMode= */ 0, /* debugContext= */ null); + } + }; mTriggerScript = new AssistantTriggerScript(dependencies.getActivity(), delegate, webContents, dependencies.getBottomSheetController(),
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantChoiceList.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantChoiceList.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantChoiceList.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantChoiceList.java index b17dbf2..a885622 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantChoiceList.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantChoiceList.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.content.res.TypedArray; @@ -24,8 +24,8 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.widget.TintedDrawable; import org.chromium.ui.widget.ChromeImageView;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java index 3cb3c6fa..521ae93 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataBinder.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
@@ -2,22 +2,22 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.app.Activity; import android.view.View; import android.view.ViewGroup; import org.chromium.base.task.PostTask; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.LoginChoiceModel; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSection.Delegate; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionContainer; import org.chromium.components.autofill_assistant.AssistantEditor.AssistantPaymentInstrumentEditor; import org.chromium.components.autofill_assistant.AssistantEditorFactory; import org.chromium.components.autofill_assistant.AssistantOptionModel.AddressModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.ContactModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel.LoginChoiceModel; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantAdditionalSection.Delegate; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionContainer; import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; @@ -35,7 +35,6 @@ class AssistantCollectUserDataBinder implements PropertyModelChangeProcessor.ViewBinder<AssistantCollectUserDataModel, AssistantCollectUserDataBinder.ViewHolder, PropertyKey> { - /** * A wrapper class that holds the different views of the CollectUserData request. */
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java index b0d12ed..a1d4cde 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java
@@ -2,18 +2,18 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.app.Activity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionContainer; import org.chromium.components.autofill_assistant.AssistantEditorFactory; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionContainer; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java index a85402b..ac4c291 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataDelegate.java
@@ -2,12 +2,12 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import androidx.annotation.Nullable; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; import org.chromium.components.autofill_assistant.AssistantOptionModel; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; /** * Common interface for autofill assistant payment request delegates.
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java index 70f9897..bf1d539 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.view.View; @@ -11,20 +11,20 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.autofill_assistant.AssistantInfoPopup; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionFactory; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantPopupListSection; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantStaticTextSection; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputSection; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputSection.TextInputFactory; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantTextInputType; import org.chromium.components.autofill_assistant.AssistantAutofillCreditCard; import org.chromium.components.autofill_assistant.AssistantAutofillProfile; +import org.chromium.components.autofill_assistant.AssistantInfoPopup; import org.chromium.components.autofill_assistant.AssistantOptionModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.AddressModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.ContactModel; import org.chromium.components.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel; import org.chromium.components.autofill_assistant.AssistantPaymentInstrument; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantAdditionalSectionFactory; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantPopupListSection; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantStaticTextSection; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantTextInputSection; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantTextInputSection.TextInputFactory; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantTextInputType; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java index 20e10810..298236d 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java
@@ -2,17 +2,17 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import androidx.annotation.Nullable; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; import org.chromium.components.autofill_assistant.AssistantAutofillCreditCard; import org.chromium.components.autofill_assistant.AssistantAutofillProfile; import org.chromium.components.autofill_assistant.AssistantOptionModel; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; /** Delegate for the Collect user data UI which forwards events to a native counterpart. */ @JNINamespace("autofill_assistant")
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataSection.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataSection.java index ba8878c..3a6b1e9 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.view.LayoutInflater; @@ -15,11 +15,11 @@ import androidx.annotation.Nullable; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantOptionModel; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.List; @@ -267,8 +267,8 @@ mContext.getResources().getDimensionPixelSize( R.dimen.autofill_assistant_payment_request_choice_list_padding_end), verticalPadding); - list.setBackgroundColor(ApiCompatibilityUtils.getColor( - mContext.getResources(), R.color.omnibox_bg_color)); + list.setBackgroundColor( + ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.omnibox_bg_color)); list.setTag(AssistantTagsForTesting.COLLECT_USER_DATA_CHOICE_LIST); if (addButtonText != null) { list.setOnAddButtonClickedListener(() -> createOrEditItem(null));
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantContactDetailsSection.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantContactDetailsSection.java index 2793a3d..6f09fa8 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantContactDetailsSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantContactDetailsSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.text.TextUtils; @@ -14,10 +14,10 @@ import androidx.annotation.Nullable; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantAutofillProfile; import org.chromium.components.autofill_assistant.AssistantEditor.AssistantContactEditor; import org.chromium.components.autofill_assistant.AssistantOptionModel.ContactModel; +import org.chromium.components.autofill_assistant.R; import java.util.ArrayList; import java.util.List; @@ -209,4 +209,4 @@ } return TextUtils.join("\n", descriptionLines); } -} \ No newline at end of file +}
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantDateTime.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantDateTime.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantDateTime.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantDateTime.java index ca1af81..91951cb 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantDateTime.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantDateTime.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantInfoSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantInfoSection.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantInfoSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantInfoSection.java index 2b6b01d..774d789 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantInfoSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantInfoSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.text.TextUtils; @@ -15,8 +15,8 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantTextUtils; +import org.chromium.components.autofill_assistant.R; /** * A section to display a text string.
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginChoice.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginChoice.java similarity index 93% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginChoice.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginChoice.java index 3c713e3..8eab9f1d 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginChoice.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginChoice.java
@@ -2,12 +2,12 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import androidx.annotation.Nullable; -import org.chromium.chrome.browser.autofill_assistant.AssistantInfoPopup; import org.chromium.components.autofill.EditableOption; +import org.chromium.components.autofill_assistant.AssistantInfoPopup; /** * Represents a single login choice.
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginSection.java similarity index 92% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginSection.java index 24db2ea..ee24d5b6 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantLoginSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import static org.chromium.components.autofill_assistant.AssistantAccessibilityUtils.setAccessibility; @@ -16,8 +16,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel.LoginChoiceModel; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataModel.LoginChoiceModel; import java.util.List; @@ -28,7 +28,7 @@ AssistantLoginSection(Context context, ViewGroup parent) { super(context, parent, R.layout.autofill_assistant_login, R.layout.autofill_assistant_login, context.getResources().getDimensionPixelSize( - org.chromium.chrome.autofill_assistant.R.dimen + org.chromium.components.autofill_assistant.R.dimen .autofill_assistant_payment_request_title_padding), /*titleAddButton=*/null, /*listAddButton=*/null); }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantPaymentMethodSection.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantPaymentMethodSection.java index 96f2688..d6de8982 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPaymentMethodSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantPaymentMethodSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.content.res.Resources; @@ -14,14 +14,15 @@ import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantAutofillCreditCard; import org.chromium.components.autofill_assistant.AssistantAutofillProfile; import org.chromium.components.autofill_assistant.AssistantEditor.AssistantPaymentInstrumentEditor; import org.chromium.components.autofill_assistant.AssistantOptionModel.PaymentInstrumentModel; import org.chromium.components.autofill_assistant.AssistantPaymentInstrument; +import org.chromium.components.autofill_assistant.R; import java.util.List; @@ -115,8 +116,8 @@ AssistantPaymentInstrument method = model.mOption; ImageView cardIssuerImageView = view.findViewById(R.id.credit_card_issuer_icon); try { - cardIssuerImageView.setImageDrawable(view.getContext().getDrawable( - method.getCreditCard().getIssuerIconDrawableId())); + cardIssuerImageView.setImageDrawable(AppCompatResources.getDrawable( + view.getContext(), method.getCreditCard().getIssuerIconDrawableId())); } catch (Resources.NotFoundException e) { cardIssuerImageView.setImageDrawable(null); } @@ -209,4 +210,4 @@ mEditor.addAddressInformationForAutocomplete(profile); } } -} \ No newline at end of file +}
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPhoneNumberSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantPhoneNumberSection.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPhoneNumberSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantPhoneNumberSection.java index 79c7df1..e162183ff 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantPhoneNumberSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantPhoneNumberSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.text.TextUtils; @@ -14,9 +14,9 @@ import androidx.annotation.Nullable; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantEditor; import org.chromium.components.autofill_assistant.AssistantOptionModel.ContactModel; +import org.chromium.components.autofill_assistant.R; import java.util.List;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantShippingAddressSection.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantShippingAddressSection.java index f9f0a33..d359992ef 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantShippingAddressSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantShippingAddressSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.text.TextUtils; @@ -14,9 +14,9 @@ import androidx.annotation.Nullable; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantEditor.AssistantAddressEditor; import org.chromium.components.autofill_assistant.AssistantOptionModel.AddressModel; +import org.chromium.components.autofill_assistant.R; import java.util.List;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantTermsSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantTermsSection.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantTermsSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantTermsSection.java index 172cfe46..1f75914 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantTermsSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantTermsSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.text.TextUtils; @@ -15,10 +15,10 @@ import androidx.annotation.Nullable; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantTagsForTesting; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; /** * The third party terms and conditions section of the Autofill Assistant payment request.
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpander.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpander.java similarity index 97% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpander.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpander.java index 9fdab1f..f64994b 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpander.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpander.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import static org.chromium.components.autofill_assistant.AssistantTagsForTesting.VERTICAL_EXPANDER_CHEVRON; @@ -16,8 +16,8 @@ import android.widget.LinearLayout; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.AssistantChevronStyle; +import org.chromium.components.autofill_assistant.AssistantChevronStyle; +import org.chromium.components.autofill_assistant.R; import org.chromium.components.browser_ui.widget.TintedDrawable; /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java similarity index 98% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java index edf502c..410d7c28a 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantVerticalExpanderAccordion.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data; +package org.chromium.components.autofill_assistant.user_data; import android.content.Context; import android.util.AttributeSet;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java similarity index 82% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java index 8b612055..0f017b07 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSection.java
@@ -2,11 +2,11 @@ // 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.autofill_assistant.user_data.additional_sections; +package org.chromium.components.autofill_assistant.user_data.additional_sections; import android.view.View; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; /** Interface for an additional section of the user data form. */ public interface AssistantAdditionalSection {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java similarity index 90% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java index 49a5466..393e209 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionContainer.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data.additional_sections; +package org.chromium.components.autofill_assistant.user_data.additional_sections; import android.content.Context; import android.view.LayoutInflater; @@ -10,10 +10,10 @@ import android.view.ViewGroup; import android.widget.Space; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; -import org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections.AssistantAdditionalSection.Delegate; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.user_data.AssistantCollectUserDataCoordinator; +import org.chromium.components.autofill_assistant.user_data.additional_sections.AssistantAdditionalSection.Delegate; import java.util.ArrayList; import java.util.Collections;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java similarity index 88% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java index 51fe8e94..74a7e48 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantAdditionalSectionFactory.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data.additional_sections; +package org.chromium.components.autofill_assistant.user_data.additional_sections; import android.content.Context; import android.view.ViewGroup;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java index f02053c9..ac50f8b8 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantPopupListSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data.additional_sections; +package org.chromium.components.autofill_assistant.user_data.additional_sections; import android.content.Context; import android.view.LayoutInflater; @@ -13,12 +13,12 @@ import androidx.annotation.Nullable; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.AssistantChevronStyle; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantVerticalExpander; +import org.chromium.components.autofill_assistant.AssistantChevronStyle; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; +import org.chromium.components.autofill_assistant.user_data.AssistantVerticalExpander; import org.chromium.content.browser.input.PopupItemType; import org.chromium.content.browser.input.SelectPopupDialog; import org.chromium.content.browser.input.SelectPopupItem;
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java similarity index 95% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java index 88f7892f..715ee1e 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantStaticTextSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data.additional_sections; +package org.chromium.components.autofill_assistant.user_data.additional_sections; import android.content.Context; import android.view.LayoutInflater; @@ -11,9 +11,9 @@ import android.widget.LinearLayout; import android.widget.TextView; -import org.chromium.chrome.autofill_assistant.R; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; /** A section which displays a simple static text message. */ public class AssistantStaticTextSection implements AssistantAdditionalSection {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java similarity index 96% rename from chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java rename to components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java index 4fb414b..0c52495b 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/additional_sections/AssistantTextInputSection.java
@@ -2,7 +2,7 @@ // 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.autofill_assistant.user_data.additional_sections; +package org.chromium.components.autofill_assistant.user_data.additional_sections; import static org.chromium.components.autofill.prefeditor.EditorFieldModel.INPUT_TYPE_HINT_ALPHA_NUMERIC; @@ -21,13 +21,13 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; -import org.chromium.chrome.autofill_assistant.R; -import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantValue; -import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantVerticalExpander; import org.chromium.components.autofill.prefeditor.EditorFieldModel; import org.chromium.components.autofill.prefeditor.EditorTextField; import org.chromium.components.autofill_assistant.AssistantTextUtils; import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.components.autofill_assistant.generic_ui.AssistantValue; +import org.chromium.components.autofill_assistant.user_data.AssistantVerticalExpander; import java.util.ArrayList; import java.util.List;
diff --git a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntry.java b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntry.java index ce13f74d..cc5d89c 100644 --- a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntry.java +++ b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntry.java
@@ -17,7 +17,7 @@ */ // TODO(fga): Figure out how to do this. @ModuleInterface(module = "autofill_assistant", - impl = "org.chromium.chrome.browser.autofill_assistant.AutofillAssistantModuleEntryImpl") + impl = "org.chromium.components.autofill_assistant.AutofillAssistantModuleEntryImpl") public interface AutofillAssistantModuleEntry { /** * Creates a concrete {@code AssistantOnboardingHelper} object. Its contents are opaque to
diff --git a/components/autofill_assistant/browser/generic_ui_java_generated_enums.h b/components/autofill_assistant/browser/generic_ui_java_generated_enums.h index 4571bf0..8f3474d 100644 --- a/components/autofill_assistant/browser/generic_ui_java_generated_enums.h +++ b/components/autofill_assistant/browser/generic_ui_java_generated_enums.h
@@ -11,7 +11,7 @@ namespace autofill_assistant { // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant) +// org.chromium.components.autofill_assistant) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantChevronStyle enum class VerticalExpanderChevronStyle { NOT_SET_AUTOMATIC = 0, @@ -20,7 +20,7 @@ }; // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.drawable) +// org.chromium.components.autofill_assistant.drawable) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantDrawableIcon enum class DrawableIcon { DRAWABLE_ICON_UNDEFINED = 0,
diff --git a/components/autofill_assistant/browser/onboarding_result.h b/components/autofill_assistant/browser/onboarding_result.h index 62ae111..5542c4a 100644 --- a/components/autofill_assistant/browser/onboarding_result.h +++ b/components/autofill_assistant/browser/onboarding_result.h
@@ -8,7 +8,7 @@ namespace autofill_assistant { // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.onboarding) +// org.chromium.components.autofill_assistant.onboarding) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantOnboardingResult enum class OnboardingResult { // The onboarding was dismissed. No explicit choice was made.
diff --git a/components/autofill_assistant/browser/overlay_state.h b/components/autofill_assistant/browser/overlay_state.h index 05de7498..8b2a735 100644 --- a/components/autofill_assistant/browser/overlay_state.h +++ b/components/autofill_assistant/browser/overlay_state.h
@@ -10,7 +10,7 @@ namespace autofill_assistant { // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.overlay) +// org.chromium.components.autofill_assistant.overlay) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantOverlayState enum OverlayState { // The overlay is completely hidden.
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_action.h b/components/autofill_assistant/browser/trigger_scripts/trigger_script_action.h index c48e0d44..ec7e58ce 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_action.h +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_action.h
@@ -11,7 +11,7 @@ // defined in proto. // // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.trigger_scripts) +// org.chromium.components.autofill_assistant.trigger_scripts) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: TriggerScriptAction enum class TriggerScriptAction { UNDEFINED = 0,
diff --git a/components/autofill_assistant/browser/tts_button_state.h b/components/autofill_assistant/browser/tts_button_state.h index 9a18a9d2..ca6384d 100644 --- a/components/autofill_assistant/browser/tts_button_state.h +++ b/components/autofill_assistant/browser/tts_button_state.h
@@ -8,7 +8,7 @@ namespace autofill_assistant { // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.header) +// org.chromium.components.autofill_assistant.header) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantTtsButtonState enum TtsButtonState { // No TTS is playing.
diff --git a/components/autofill_assistant/browser/user_data.h b/components/autofill_assistant/browser/user_data.h index 86241cd..e04c594 100644 --- a/components/autofill_assistant/browser/user_data.h +++ b/components/autofill_assistant/browser/user_data.h
@@ -30,7 +30,7 @@ class UserModel; // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.user_data) +// org.chromium.components.autofill_assistant.user_data) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantTermsAndConditionsState enum TermsAndConditionsState { NOT_SELECTED = 0, @@ -39,12 +39,12 @@ }; // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.user_data.additional_sections) +// org.chromium.components.autofill_assistant.user_data.additional_sections) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantTextInputType enum TextInputType { INPUT_TEXT = 0, INPUT_ALPHANUMERIC = 1 }; // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.user_data) +// org.chromium.components.autofill_assistant.user_data) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantContactField enum AutofillContactField { NAME_FULL = 7, @@ -53,7 +53,7 @@ }; // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant.user_data) +// org.chromium.components.autofill_assistant.user_data) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantUserDataEventType enum UserDataEventType { UNKNOWN,
diff --git a/components/autofill_assistant/browser/viewport_mode.h b/components/autofill_assistant/browser/viewport_mode.h index b81c6d1..e3fc4b3 100644 --- a/components/autofill_assistant/browser/viewport_mode.h +++ b/components/autofill_assistant/browser/viewport_mode.h
@@ -10,7 +10,7 @@ namespace autofill_assistant { // GENERATED_JAVA_ENUM_PACKAGE: ( -// org.chromium.chrome.browser.autofill_assistant) +// org.chromium.components.autofill_assistant) // GENERATED_JAVA_CLASS_NAME_OVERRIDE: AssistantViewportMode enum ViewportMode { // Don't resize the layout nor visual viewport.
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 859c9783..31982fa2 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "5.38", - "log_list_timestamp": "2022-03-01T01:35:31Z", + "version": "5.39", + "log_list_timestamp": "2022-03-02T01:35:23Z", "operators": [ { "name": "Google",
diff --git a/components/custom_handlers/BUILD.gn b/components/custom_handlers/BUILD.gn index d66b5ac8..b09e34f 100644 --- a/components/custom_handlers/BUILD.gn +++ b/components/custom_handlers/BUILD.gn
@@ -6,6 +6,8 @@ sources = [ "pref_names.cc", "pref_names.h", + "protocol_handler.cc", + "protocol_handler.h", "protocol_handler_registry.cc", "protocol_handler_registry.h", "protocol_handler_throttle.cc", @@ -17,9 +19,11 @@ "//components/keyed_service/core", "//components/pref_registry", "//components/prefs", + "//components/strings", "//components/user_prefs", "//content/public/browser", "//content/public/common", + "//net", "//services/network/public/cpp:cpp_base", "//third_party/blink/public/common:headers", ] @@ -32,7 +36,6 @@ deps += [ "//components/permissions", - "//components/strings", "//ui/base", ] }
diff --git a/components/custom_handlers/DEPS b/components/custom_handlers/DEPS index 32f80b99..0379ae6 100644 --- a/components/custom_handlers/DEPS +++ b/components/custom_handlers/DEPS
@@ -9,8 +9,8 @@ "+content/public/browser", "+content/public/common", "+content/public/test", - "+third_party/blink/public/common/loader", - "+third_party/blink/public/common/security", + "+net/base", + "+third_party/blink/public/common", "+services/network/public/cpp", "+ui/base/l10n", ]
diff --git a/content/public/common/custom_handlers/protocol_handler.cc b/components/custom_handlers/protocol_handler.cc similarity index 83% rename from content/public/common/custom_handlers/protocol_handler.cc rename to components/custom_handlers/protocol_handler.cc index b2b64c85..5ccf8a5 100644 --- a/content/public/common/custom_handlers/protocol_handler.cc +++ b/components/custom_handlers/protocol_handler.cc
@@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/public/common/custom_handlers/protocol_handler.h" +#include "components/custom_handlers/protocol_handler.h" #include "base/json/values_util.h" +#include "base/strings/utf_string_conversions.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/browser/browser_thread.h" #include "content/public/common/content_client.h" #include "content/public/common/origin_util.h" #include "net/base/escape.h" @@ -12,8 +15,11 @@ #include "third_party/blink/public/common/custom_handlers/protocol_handler_utils.h" #include "third_party/blink/public/common/scheme_registry.h" #include "third_party/blink/public/common/security/protocol_handler_security_level.h" +#include "ui/base/l10n/l10n_util.h" -namespace content { +using content::BrowserThread; + +namespace custom_handlers { ProtocolHandler::ProtocolHandler( const std::string& protocol, @@ -32,6 +38,7 @@ const std::string& protocol, const GURL& url, blink::ProtocolHandlerSecurityLevel security_level) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return ProtocolHandler(protocol, url, base::Time::Now(), security_level); } @@ -52,6 +59,7 @@ const std::string& protocol, const GURL& url, const std::string& app_id) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return ProtocolHandler(protocol, url, app_id, base::Time::Now(), blink::ProtocolHandlerSecurityLevel::kStrict); } @@ -68,6 +76,7 @@ // This matches VerifyCustomHandlerURLSecurity() in blink's // NavigatorContentUtils. // https://html.spec.whatwg.org/multipage/system-state.html#normalize-protocol-handler-parameters + DCHECK_CURRENTLY_ON(BrowserThread::UI); bool has_valid_scheme = url_.SchemeIsHTTPOrHTTPS() || (security_level_ == @@ -84,19 +93,21 @@ has_custom_scheme_prefix); } -bool ProtocolHandler::IsSameOrigin( - const ProtocolHandler& handler) const { +bool ProtocolHandler::IsSameOrigin(const ProtocolHandler& handler) const { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return handler.url().DeprecatedGetOriginAsURL() == url_.DeprecatedGetOriginAsURL(); } const ProtocolHandler& ProtocolHandler::EmptyProtocolHandler() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); static const ProtocolHandler* const kEmpty = new ProtocolHandler(); return *kEmpty; } ProtocolHandler ProtocolHandler::CreateProtocolHandler( const base::DictionaryValue* value) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!IsValidDict(value)) { return EmptyProtocolHandler(); } @@ -132,6 +143,7 @@ } GURL ProtocolHandler::TranslateUrl(const GURL& url) const { + DCHECK_CURRENTLY_ON(BrowserThread::UI); std::string translatedUrlSpec(url_.spec()); base::ReplaceFirstSubstringAfterOffset( &translatedUrlSpec, 0, "%s", @@ -140,6 +152,7 @@ } std::unique_ptr<base::DictionaryValue> ProtocolHandler::Encode() const { + DCHECK_CURRENTLY_ON(BrowserThread::UI); auto d = std::make_unique<base::DictionaryValue>(); d->SetString("protocol", protocol_); d->SetString("url", url_.spec()); @@ -154,18 +167,22 @@ std::u16string ProtocolHandler::GetProtocolDisplayName( const std::string& protocol) { - return content::GetContentClient()->GetLocalizedProtocolName(protocol); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (protocol == "mailto") + return l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_MAILTO_NAME); + if (protocol == "webcal") + return l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_WEBCAL_NAME); + return base::UTF8ToUTF16(protocol); } std::u16string ProtocolHandler::GetProtocolDisplayName() const { + DCHECK_CURRENTLY_ON(BrowserThread::UI); return GetProtocolDisplayName(protocol_); } #if !defined(NDEBUG) std::string ProtocolHandler::ToString() const { - return "{ protocol=" + protocol_ + - ", url=" + url_.spec() + - " }"; + return "{ protocol=" + protocol_ + ", url=" + url_.spec() + " }"; } #endif @@ -181,4 +198,4 @@ return url_ < other.url_; } -} // namespace content +} // namespace custom_handlers
diff --git a/content/public/common/custom_handlers/protocol_handler.h b/components/custom_handlers/protocol_handler.h similarity index 90% rename from content/public/common/custom_handlers/protocol_handler.h rename to components/custom_handlers/protocol_handler.h index 99054e99..c31ba3629 100644 --- a/content/public/common/custom_handlers/protocol_handler.h +++ b/components/custom_handlers/protocol_handler.h
@@ -2,26 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_PUBLIC_COMMON_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_ -#define CONTENT_PUBLIC_COMMON_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_ +#ifndef COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_ +#define COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_ #include <memory> #include <string> #include "base/time/time.h" #include "base/values.h" -#include "content/common/content_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/security/protocol_handler_security_level.h" #include "url/gurl.h" -namespace content { +namespace custom_handlers { // A single tuple of (protocol, url, last_modified) that indicates how URLs // of the given protocol should be rewritten to be handled. // The |last_modified| field is used to correctly perform deletion // of protocol handlers based on time ranges. -class CONTENT_EXPORT ProtocolHandler { +class ProtocolHandler { public: static ProtocolHandler CreateProtocolHandler( const std::string& protocol, @@ -90,9 +89,7 @@ const absl::optional<std::string>& web_app_id() const { return web_app_id_; } const base::Time& last_modified() const { return last_modified_; } - bool IsEmpty() const { - return protocol_.empty(); - } + bool IsEmpty() const { return protocol_.empty(); } #if !defined(NDEBUG) // Returns a string representation suitable for use in debugging. @@ -112,6 +109,6 @@ blink::ProtocolHandlerSecurityLevel security_level_; }; -} // namespace content +} // namespace custom_handlers -#endif // CONTENT_PUBLIC_COMMON_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_ +#endif // COMPONENTS_CUSTOM_HANDLERS_PROTOCOL_HANDLER_H_
diff --git a/components/custom_handlers/protocol_handler_registry.cc b/components/custom_handlers/protocol_handler_registry.cc index 14b2f768..5dd85e1e 100644 --- a/components/custom_handlers/protocol_handler_registry.cc +++ b/components/custom_handlers/protocol_handler_registry.cc
@@ -18,16 +18,15 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/custom_handlers/pref_names.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/user_prefs/user_prefs.h" #include "content/public/browser/child_process_security_policy.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "third_party/abseil-cpp/absl/types/optional.h" using content::BrowserThread; using content::ChildProcessSecurityPolicy; -using content::ProtocolHandler; namespace custom_handlers {
diff --git a/components/custom_handlers/protocol_handler_registry.h b/components/custom_handlers/protocol_handler_registry.h index fa0a2f00..eba3719 100644 --- a/components/custom_handlers/protocol_handler_registry.h +++ b/components/custom_handlers/protocol_handler_registry.h
@@ -14,21 +14,22 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/task/sequenced_task_runner_helpers.h" +#include "base/time/time.h" #include "base/values.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" -#include "content/public/common/custom_handlers/protocol_handler.h" namespace user_prefs { class PrefRegistrySyncable; } -using content::ProtocolHandler; using DefaultClientCallback = base::OnceCallback<void(bool)>; namespace custom_handlers { +class ProtocolHandler; + // This is where handlers for protocols registered with // navigator.registerProtocolHandler() are registered. Each Profile owns an // instance of this class, which is initialized on browser start through
diff --git a/components/custom_handlers/protocol_handler_registry_unittest.cc b/components/custom_handlers/protocol_handler_registry_unittest.cc index dc49e12..c2aa177 100644 --- a/components/custom_handlers/protocol_handler_registry_unittest.cc +++ b/components/custom_handlers/protocol_handler_registry_unittest.cc
@@ -17,6 +17,7 @@ #include "base/task/post_task.h" #include "build/build_config.h" #include "components/custom_handlers/pref_names.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/custom_handlers/protocol_handler_registry.h" #include "components/custom_handlers/test_protocol_handler_registry_delegate.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -24,7 +25,6 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/user_prefs/user_prefs.h" #include "content/public/browser/browser_task_traits.h" -#include "content/public/common/custom_handlers/protocol_handler.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_renderer_host.h" @@ -32,7 +32,6 @@ #include "third_party/blink/public/common/security/protocol_handler_security_level.h" using content::BrowserThread; -using content::ProtocolHandler; namespace custom_handlers {
diff --git a/components/custom_handlers/register_protocol_handler_permission_request.h b/components/custom_handlers/register_protocol_handler_permission_request.h index fa1cb43..173e14e 100644 --- a/components/custom_handlers/register_protocol_handler_permission_request.h +++ b/components/custom_handlers/register_protocol_handler_permission_request.h
@@ -7,15 +7,13 @@ #include "base/callback_helpers.h" #include "base/memory/raw_ptr.h" +#include "components/custom_handlers/protocol_handler.h" #include "components/permissions/permission_request.h" -#include "content/public/common/custom_handlers/protocol_handler.h" namespace permissions { enum class RequestType; } // namespace permissions -using content::ProtocolHandler; - class GURL; namespace custom_handlers { class ProtocolHandlerRegistry;
diff --git a/components/messages/android/messages_feature.cc b/components/messages/android/messages_feature.cc index ede8673..287a624 100644 --- a/components/messages/android/messages_feature.cc +++ b/components/messages/android/messages_feature.cc
@@ -18,7 +18,7 @@ "MessagesForAndroidInfrastructure", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kMessagesForAndroidInstantApps{ - "MessagesForAndroidInstantApps", base::FEATURE_DISABLED_BY_DEFAULT}; + "MessagesForAndroidInstantApps", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kMessagesForAndroidNearOomReduction{ "MessagesForAndroidNearOomReduction", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/metrics/call_stack_profile_builder_unittest.cc b/components/metrics/call_stack_profile_builder_unittest.cc index fe564b78..7a3c33e 100644 --- a/components/metrics/call_stack_profile_builder_unittest.cc +++ b/components/metrics/call_stack_profile_builder_unittest.cc
@@ -111,11 +111,11 @@ std::vector<base::Frame> frames1 = {frame1, frame2}; std::vector<base::Frame> frames2 = {frame3}; - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames1, base::TimeTicks()); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames2, base::TimeTicks()); profile_builder->OnProfileCompleted(base::Milliseconds(500), base::Milliseconds(100)); @@ -213,11 +213,11 @@ // Two stacks are completed with the same frames therefore they are deduped // to one. - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames, base::TimeTicks()); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames, base::TimeTicks()); profile_builder->OnProfileCompleted(base::TimeDelta(), base::TimeDelta()); @@ -254,11 +254,11 @@ std::vector<base::Frame> frames2 = {frame2}; // Two stacks are completed with the different frames therefore not deduped. - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames1, base::TimeTicks()); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames2, base::TimeTicks()); profile_builder->OnProfileCompleted(base::TimeDelta(), base::TimeDelta()); @@ -303,8 +303,8 @@ std::vector<base::Frame> frames = {frame1, frame2}; - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames, base::TimeTicks()); profile_builder->OnProfileCompleted(base::TimeDelta(), base::TimeDelta()); @@ -357,8 +357,8 @@ std::vector<base::Frame> frames = {frame1, frame2}; - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted(frames, base::TimeTicks()); profile_builder->OnProfileCompleted(base::TimeDelta(), base::TimeDelta()); @@ -410,26 +410,26 @@ // Id 0 means the message loop hasn't been started yet, so the sample should // not have continued_work set. - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, base::TimeTicks()); // The second sample with the same id should have continued_work set. work_id_recorder.current_id = 1; - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, base::TimeTicks()); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, base::TimeTicks()); // Ids are in general non-contiguous across multiple samples. work_id_recorder.current_id = 10; - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, base::TimeTicks()); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, base::TimeTicks()); profile_builder->OnProfileCompleted(base::Milliseconds(500), @@ -475,9 +475,9 @@ base::TestModule module; base::Frame frame = {0x10, &module}; - metadata_recorder.Set(100, absl::nullopt, 10); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 10); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, base::TimeTicks()); profile_builder->OnProfileCompleted(base::Milliseconds(500), @@ -513,22 +513,22 @@ base::TimeTicks profile_start_time = base::TimeTicks::UnixEpoch(); base::TimeDelta sample_time_delta = base::Seconds(1); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, profile_start_time); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, profile_start_time + sample_time_delta); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted( {frame}, profile_start_time + 2 * sample_time_delta); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted( {frame}, profile_start_time + 3 * sample_time_delta); @@ -536,7 +536,7 @@ profile_builder->ApplyMetadataRetrospectively( profile_start_time + sample_time_delta, profile_start_time + sample_time_delta * 2, - base::MetadataRecorder::Item(3, 30, 300)); + base::MetadataRecorder::Item(3, 30, absl::nullopt, 300)); profile_builder->OnProfileCompleted(3 * sample_time_delta, sample_time_delta); @@ -578,29 +578,29 @@ base::TimeTicks profile_start_time = base::TimeTicks::UnixEpoch(); base::TimeDelta sample_time_delta = base::Seconds(1); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, profile_start_time); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted({frame}, profile_start_time + sample_time_delta); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted( {frame}, profile_start_time + 2 * sample_time_delta); - profile_builder->RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + profile_builder->RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); profile_builder->OnSampleCompleted( {frame}, profile_start_time + 3 * sample_time_delta); profile_builder->ApplyMetadataRetrospectively( profile_start_time - base::Microseconds(1), profile_start_time + sample_time_delta, - base::MetadataRecorder::Item(3, 30, 300)); + base::MetadataRecorder::Item(3, 30, absl::nullopt, 300)); profile_builder->OnProfileCompleted(3 * sample_time_delta, sample_time_delta);
diff --git a/components/metrics/call_stack_profile_metadata_unittest.cc b/components/metrics/call_stack_profile_metadata_unittest.cc index f1a0407..ccdab81 100644 --- a/components/metrics/call_stack_profile_metadata_unittest.cc +++ b/components/metrics/call_stack_profile_metadata_unittest.cc
@@ -84,8 +84,8 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -99,9 +99,9 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -119,9 +119,9 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -135,18 +135,40 @@ EXPECT_EQ(10, items[0].value()); } +TEST(CallStackProfileMetadataTest, MetadataRecorder_SetThreadItem) { + base::MetadataRecorder metadata_recorder; + CallStackProfileMetadata metadata; + google::protobuf::RepeatedField<uint64_t> name_hashes; + + metadata_recorder.Set(100, absl::nullopt, base::PlatformThread::CurrentId(), + 10); + metadata_recorder.Set(100, absl::nullopt, base::kInvalidThreadId, 20); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); + google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = + metadata.CreateSampleMetadata(&name_hashes); + + ASSERT_EQ(1, name_hashes.size()); + EXPECT_EQ(100u, name_hashes[0]); + + ASSERT_EQ(1, items.size()); + EXPECT_EQ(0, items[0].name_hash_index()); + EXPECT_FALSE(items[0].has_key()); + EXPECT_EQ(10, items[0].value()); +} + TEST(CallStackProfileMetadataTest, MetadataRecorder_RepeatItem) { base::MetadataRecorder metadata_recorder; CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -161,13 +183,13 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -182,14 +204,14 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Set(100, absl::nullopt, 11); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 11); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -206,14 +228,14 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Set(100, 50, 11); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, 50, absl::nullopt, 11); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -231,14 +253,14 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Set(101, absl::nullopt, 11); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(101, absl::nullopt, absl::nullopt, 11); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -256,14 +278,14 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Set(101, 50, 11); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(101, 50, absl::nullopt, 11); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -282,14 +304,14 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Remove(100, absl::nullopt); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Remove(100, absl::nullopt, absl::nullopt); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -306,14 +328,14 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Remove(100, 50); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Remove(100, 50, absl::nullopt); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -326,16 +348,42 @@ EXPECT_FALSE(items[0].has_value()); } +TEST(CallStackProfileMetadataTest, MetadataRecorder_RemovedThreadItem) { + base::MetadataRecorder metadata_recorder; + CallStackProfileMetadata metadata; + google::protobuf::RepeatedField<uint64_t> name_hashes; + + metadata_recorder.Set(100, absl::nullopt, base::PlatformThread::CurrentId(), + 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); + (void)metadata.CreateSampleMetadata(&name_hashes); + + metadata_recorder.Remove(100, absl::nullopt, + base::PlatformThread::CurrentId()); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); + google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = + metadata.CreateSampleMetadata(&name_hashes); + + EXPECT_EQ(1, name_hashes.size()); + + ASSERT_EQ(1, items.size()); + EXPECT_EQ(0, items[0].name_hash_index()); + EXPECT_FALSE(items[0].has_key()); + EXPECT_FALSE(items[0].has_value()); +} + TEST(CallStackProfileMetadataTest, MetadataRecorder_SetMixedUnkeyedAndKeyedItems) { base::MetadataRecorder metadata_recorder; CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 20); - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 20); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -357,15 +405,15 @@ CallStackProfileMetadata metadata; google::protobuf::RepeatedField<uint64_t> name_hashes; - metadata_recorder.Set(100, absl::nullopt, 20); - metadata_recorder.Set(100, 50, 10); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(100, absl::nullopt, absl::nullopt, 20); + metadata_recorder.Set(100, 50, absl::nullopt, 10); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); std::ignore = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Remove(100, absl::nullopt); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Remove(100, absl::nullopt, absl::nullopt); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); google::protobuf::RepeatedPtrField<CallStackProfile::MetadataItem> items = metadata.CreateSampleMetadata(&name_hashes); @@ -386,7 +434,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); metadata.ApplyMetadata(item, stack_samples.begin() + 1, stack_samples.begin() + 4, &stack_samples, &name_hashes); @@ -419,8 +467,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(4, 30, 300); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(4, 30, absl::nullopt, 300); metadata.ApplyMetadata(item1, stack_samples.begin() + 1, stack_samples.begin() + 4, &stack_samples, &name_hashes); @@ -456,9 +504,10 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 40, 300); - const base::MetadataRecorder::Item item3(3, absl::nullopt, 300); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 40, absl::nullopt, 300); + const base::MetadataRecorder::Item item3(3, absl::nullopt, absl::nullopt, + 300); metadata.ApplyMetadata(item1, stack_samples.begin() + 1, stack_samples.begin() + 4, &stack_samples, &name_hashes); @@ -498,7 +547,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); metadata.ApplyMetadata(item, stack_samples.begin() + 1, stack_samples.begin() + 1, &stack_samples, &name_hashes); @@ -520,7 +569,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); metadata.ApplyMetadata(item, stack_samples.begin() + 1, stack_samples.end(), &stack_samples, &name_hashes); @@ -538,8 +587,8 @@ EXPECT_EQ(0, stack_samples[4].metadata_size()); base::MetadataRecorder metadata_recorder; - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); @@ -556,26 +605,27 @@ stack_samples; google::protobuf::RepeatedField<uint64_t> name_hashes; - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(5, 50, 500); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(5, 50, absl::nullopt, 500); stack_samples.Add(); // Apply then remove item1. - metadata_recorder.Set(item1.name_hash, *item1.key, item1.value); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(item1.name_hash, *item1.key, item1.thread_id, + item1.value); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); - metadata_recorder.Remove(item1.name_hash, *item1.key); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Remove(item1.name_hash, *item1.key, item1.thread_id); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); @@ -619,23 +669,24 @@ stack_samples; google::protobuf::RepeatedField<uint64_t> name_hashes; - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); // Record item1 on an ongoing basis via RecordMetadata. - metadata_recorder.Set(item1.name_hash, *item1.key, item1.value); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata_recorder.Set(item1.name_hash, *item1.key, item1.thread_id, + item1.value); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); @@ -655,8 +706,8 @@ EXPECT_EQ(0, stack_samples[2].metadata_size()); // The next recorded sample should have item1 applied since it's still active. - metadata.RecordMetadata( - base::MetadataRecorder::MetadataProvider(&metadata_recorder)); + metadata.RecordMetadata(base::MetadataRecorder::MetadataProvider( + &metadata_recorder, base::PlatformThread::CurrentId())); *stack_samples.Add()->mutable_metadata() = metadata.CreateSampleMetadata(&name_hashes); @@ -674,7 +725,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); // Apply metadata over two non-overlapping ranges. metadata.ApplyMetadata(item, stack_samples.begin(), stack_samples.begin() + 2, @@ -713,7 +764,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); // Apply metadata over two ranges where the second starts on the same sample // that the first ends. This should result in one range covering both. @@ -750,8 +801,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); metadata.ApplyMetadata(item1, stack_samples.begin(), stack_samples.begin() + 2, &stack_samples, @@ -790,7 +841,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); metadata.ApplyMetadata(item, stack_samples.begin(), stack_samples.begin() + 4, &stack_samples, &name_hashes); @@ -826,8 +877,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); // Apply metadata over a range, then over a range fully enclosed within the // first one. @@ -869,7 +920,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); // Apply metadata over a range, then over a range that fully encloses the // first one. @@ -907,8 +958,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); // Apply metadata over a range, then over a range that fully encloses the // first one. @@ -946,7 +997,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); // Apply metadata over a range, then over a range that overlaps the beginning // (but not the end) of first one. @@ -985,8 +1036,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); // Apply metadata over a range, then over a range that overlaps the beginning // (but not the end) of first one. @@ -1026,7 +1077,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); // Apply metadata over a range, then over a range that overlaps the beginning // (but not the end) of first one. @@ -1064,8 +1115,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); // Apply metadata over a range, then over a range that overlaps the beginning // (but not the end) of first one. @@ -1104,7 +1155,7 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item(3, 30, 300); + const base::MetadataRecorder::Item item(3, 30, absl::nullopt, 300); // Apply metadata over the same range with one value, then a different value. metadata.ApplyMetadata(item, stack_samples.begin() + 1, @@ -1141,8 +1192,8 @@ for (int i = 0; i < 5; i++) stack_samples.Add(); - const base::MetadataRecorder::Item item1(3, 30, 300); - const base::MetadataRecorder::Item item2(3, 30, 400); + const base::MetadataRecorder::Item item1(3, 30, absl::nullopt, 300); + const base::MetadataRecorder::Item item2(3, 30, absl::nullopt, 400); // Apply metadata over the same range with one value, then a different value. metadata.ApplyMetadata(item1, stack_samples.begin() + 1,
diff --git a/components/optimization_guide/core/prediction_manager.cc b/components/optimization_guide/core/prediction_manager.cc index 6c70ddb..0281fa7 100644 --- a/components/optimization_guide/core/prediction_manager.cc +++ b/components/optimization_guide/core/prediction_manager.cc
@@ -138,7 +138,8 @@ // remote Optimization Guide Service. bool ShouldFetchModels(bool off_the_record, PrefService* pref_service) { return optimization_guide::features::IsRemoteFetchingEnabled(pref_service) && - !off_the_record; + !off_the_record && + optimization_guide::features::IsModelDownloadingEnabled(); } std::unique_ptr<optimization_guide::proto::PredictionModel> @@ -347,17 +348,15 @@ // initialization flow since the model engine version needs to continuously be // updated for the fetch. proto::ModelInfo base_model_info; - if (features::IsModelDownloadingEnabled()) { - // There should only be one supported model engine version at a time. - base_model_info.add_supported_model_engine_versions( - proto::MODEL_ENGINE_VERSION_TFLITE_2_9_0_1); - // This histogram is used for integration tests. Do not remove. - // Update this to be 10000 if/when we exceed 100 model engine versions. - LOCAL_HISTOGRAM_COUNTS_100( - "OptimizationGuide.PredictionManager.SupportedModelEngineVersion", - static_cast<int>( - *base_model_info.supported_model_engine_versions().begin())); - } + // There should only be one supported model engine version at a time. + base_model_info.add_supported_model_engine_versions( + proto::MODEL_ENGINE_VERSION_TFLITE_2_9_0_1); + // This histogram is used for integration tests. Do not remove. + // Update this to be 10000 if/when we exceed 100 model engine versions. + LOCAL_HISTOGRAM_COUNTS_100( + "OptimizationGuide.PredictionManager.SupportedModelEngineVersion", + static_cast<int>( + *base_model_info.supported_model_engine_versions().begin())); if (switches::IsModelOverridePresent()) return; @@ -370,11 +369,9 @@ if (registered_optimization_targets_and_metadata_.empty()) return; - // TODO(crbug/1245793): Do not fetch models if model downloading is not - // enabled. This is not done currently since there are too many tests that - // depend on the fetch always going out even in the non-downloads case and the - // overall cleanup is already in progress. - + // We should have already created a prediction model download manager if we + // initiated the fetching of models. + DCHECK(prediction_model_download_manager_); if (prediction_model_download_manager_) { bool download_service_available = prediction_model_download_manager_->IsAvailableForDownloads(); @@ -487,6 +484,9 @@ bool has_models_to_update = false; for (const auto& model : prediction_models) { if (model.has_model() && !model.model().download_url().empty()) { + // We should only be updating the store for on-the-record profiles and + // after the store has been initialized. + DCHECK(prediction_model_download_manager_); if (prediction_model_download_manager_) { GURL download_url(model.model().download_url()); if (download_url.is_valid()) {
diff --git a/components/optimization_guide/core/prediction_manager_unittest.cc b/components/optimization_guide/core/prediction_manager_unittest.cc index e3ab4345..87abad2 100644 --- a/components/optimization_guide/core/prediction_manager_unittest.cc +++ b/components/optimization_guide/core/prediction_manager_unittest.cc
@@ -512,6 +512,33 @@ EXPECT_FALSE(prediction_model_fetcher()->models_fetched()); } +class PredictionManagerModelDownloadingDisabledTest + : public PredictionManagerTestBase { + public: + PredictionManagerModelDownloadingDisabledTest() { + // This needs to be done before any tasks are run that might check if a + // feature is enabled, to avoid tsan errors. + feature_list_.InitAndDisableFeature( + features::kOptimizationGuideModelDownloading); + } +}; + +TEST_F(PredictionManagerModelDownloadingDisabledTest, + ModelDownloadingDisabledShouldNotFetch) { + CreatePredictionManager(); + + prediction_manager()->SetPredictionModelFetcherForTesting( + BuildTestPredictionModelFetcher( + PredictionModelFetcherEndState::kFetchSuccessWithModels)); + + FakeOptimizationTargetModelObserver observer; + prediction_manager()->AddObserverForOptimizationTargetModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, absl::nullopt, &observer); + SetStoreInitialized(); + + EXPECT_FALSE(prediction_model_fetcher()->models_fetched()); +} + class PredictionManagerTest : public PredictionManagerTestBase { public: PredictionManagerTest() { @@ -575,8 +602,7 @@ // Make sure the test histogram is recorded. We don't check for value here // since that is too much toil for someone whenever they add a new version. histogram_tester.ExpectTotalCount( - "OptimizationGuide.PredictionManager.SupportedModelEngineVersion", - features::IsModelDownloadingEnabled() ? 1 : 0); + "OptimizationGuide.PredictionManager.SupportedModelEngineVersion", 1); EXPECT_TRUE(prediction_manager()->GetRegisteredOptimizationTargets().contains( proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); @@ -754,8 +780,7 @@ // We don't check for value here since that is too much toil for someone // whenever they add a new version. histogram_tester.ExpectTotalCount( - "OptimizationGuide.PredictionManager.SupportedModelEngineVersion", - features::IsModelDownloadingEnabled() ? 1 : 0); + "OptimizationGuide.PredictionManager.SupportedModelEngineVersion", 1); EXPECT_TRUE(prediction_manager()->GetRegisteredOptimizationTargets().contains( proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc index 9190266..824e73d 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc
@@ -109,18 +109,6 @@ ~BuiltInBackendToAndroidBackendMigrator() = default; void BuiltInBackendToAndroidBackendMigrator::StartMigrationIfNecessary() { - bool is_initial_migration_needed = IsInitialMigrationNeeded(prefs_); - - // For syncing users, we don't need to move passwords between the built-in - // and the Android backends, since both backends should be able to - // retrieve the same passwords from the sync server. - if (sync_delegate_->IsSyncingPasswordsEnabled() && - is_initial_migration_needed) { - // TODO:(crbug.com/1252443) Drop metadata and only then update pref. - UpdateMigrationVersionInPref(); - return; - } - // Don't try to migrate passwords if there was an attempt earlier today. base::TimeDelta time_passed_since_last_migration_attempt = base::Time::Now() - @@ -129,9 +117,11 @@ if (time_passed_since_last_migration_attempt < kMigrationThreshold) return; + bool is_initial_migration_needed = IsInitialMigrationNeeded(prefs_); // Manually migrate passwords between backends if initial or rolling migration - // is needed. Even for syncing users we still should do rolling migration to - // ensure deletions aren’t resurrected. + // is needed. Even for syncing users we still should do the initial migration + // to move local-only data that aren't synced to GMSCore and do the rolling + // migration to ensure deletions aren’t resurrected. if (is_initial_migration_needed || base::FeatureList::IsEnabled(features::kUnifiedPasswordManagerAndroid)) { metrics_reporter_ = std::make_unique<MigrationMetricsReporter>( @@ -141,6 +131,10 @@ } void BuiltInBackendToAndroidBackendMigrator::UpdateMigrationVersionInPref() { + if (IsInitialMigrationNeeded(prefs_) && + sync_delegate_->IsSyncingPasswordsEnabled()) { + // TODO(crbug.com/1302299): Drop metadata and only then update pref. + } prefs_->SetInteger(prefs::kCurrentMigrationVersionToGoogleMobileServices, features::kMigrationVersion.Get()); } @@ -149,6 +143,19 @@ prefs_->SetDouble(password_manager::prefs::kTimeOfLastMigrationAttempt, base::Time::Now().ToDoubleT()); + // For sync users, migrate local-only data from the built-in backend to the + // Android backend. The synced passwords should otherwise be identical. Update + // calls don't fail because they would add a password in the rare case that it + // doesn't exist in the Android backend. + if (IsInitialMigrationNeeded(prefs_) && + sync_delegate_->IsSyncingPasswordsEnabled()) { + built_in_backend_->GetAllLoginsAsync( + base::BindOnce(&BuiltInBackendToAndroidBackendMigrator:: + MigrateNonSyncableDataToAndroidBackend, + weak_ptr_factory_.GetWeakPtr())); + return; + } + auto barrier_callback = base::BarrierCallback<BackendAndLoginsResults>( 2, base::BindOnce(&BuiltInBackendToAndroidBackendMigrator:: MigratePasswordsBetweenAndroidAndBuiltInBackends, @@ -169,6 +176,38 @@ } void BuiltInBackendToAndroidBackendMigrator:: + MigrateNonSyncableDataToAndroidBackend( + LoginsResultOrError built_in_backend_logins_or_error) { + if (absl::holds_alternative<PasswordStoreBackendError>( + built_in_backend_logins_or_error)) { + MigrationFinished(/*is_success=*/false); + return; + } + + // Like a stack, callbacks are chained by by passing 'callback_chain' as a + // completion for the next operation. At the end, update pref to mark + // successful completion. + base::OnceClosure callbacks_chain = + base::BindOnce(&BuiltInBackendToAndroidBackendMigrator::MigrationFinished, + weak_ptr_factory_.GetWeakPtr(), /*is_success=*/true); + + callbacks_chain = + base::BindOnce( + &BuiltInBackendToAndroidBackendMigrator::UpdateMigrationVersionInPref, + weak_ptr_factory_.GetWeakPtr()) + .Then(std::move(callbacks_chain)); + + for (const auto& login : + absl::get<LoginsResult>(built_in_backend_logins_or_error)) { + callbacks_chain = base::BindOnce( + &BuiltInBackendToAndroidBackendMigrator::UpdateLoginInBackend, + weak_ptr_factory_.GetWeakPtr(), android_backend_, *login, + std::move(callbacks_chain)); + } + std::move(callbacks_chain).Run(); +} + +void BuiltInBackendToAndroidBackendMigrator:: MigratePasswordsBetweenAndroidAndBuiltInBackends( std::vector<BackendAndLoginsResults> results) { DCHECK(metrics_reporter_);
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h index 979a475d..44abecab 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h
@@ -51,6 +51,13 @@ // Schedules async calls to read of all passwords from both backends. void PrepareForMigration(); + // Migrates all non-syncable data from the |built_in_backend_| to the + // |android_backend_|. This is implemented by reading all the passwords from + // the |built_in_backend_| and use that to issue update requests to the + // credentials in the |android_backend_|. + void MigrateNonSyncableDataToAndroidBackend( + LoginsResultOrError built_in_backend_logins_or_error); + // Migrates password between |built_in_backend_| and |android_backend_|. // |result| consists of passwords from the |built_in_backend_| let's call them // |A| and passwords from the |android_backend_| - |B|. If initial migration
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc index 0523d9a6..c5ad3d93 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc
@@ -97,17 +97,16 @@ {{"migration_version", "1"}}); Init(); EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(true)); + .WillRepeatedly(Return(true)); migrator()->StartMigrationIfNecessary(); RunUntilIdle(); EXPECT_EQ(1, prefs()->GetInteger( prefs::kCurrentMigrationVersionToGoogleMobileServices)); - // Since for syncing users we don't manually migrate passwords - // |kTimeOfLastMigrationAttempt| shouldn't be updated. - EXPECT_EQ(0, prefs()->GetDouble( - password_manager::prefs::kTimeOfLastMigrationAttempt)); + EXPECT_EQ( + base::Time::Now().ToDoubleT(), + prefs()->GetDouble(password_manager::prefs::kTimeOfLastMigrationAttempt)); } TEST_F(BuiltInBackendToAndroidBackendMigratorTest, @@ -118,7 +117,7 @@ Init(); EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); + .WillRepeatedly(Return(false)); migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -138,8 +137,6 @@ prefs()->SetDouble(password_manager::prefs::kTimeOfLastMigrationAttempt, (base::Time::Now() - base::Hours(2)).ToDoubleT()); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -160,9 +157,6 @@ /*disabled_features=*/{features::kUnifiedPasswordManagerAndroid}); Init(/*current_migration_version=*/1); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); - migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -182,9 +176,6 @@ /*disabled_features=*/{}); Init(/*current_migration_version=*/1); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); - migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -241,6 +232,37 @@ histogram_tester.ExpectBucketCount(kMigrationFinishedMetric, false, 1); } +TEST_F(BuiltInBackendToAndroidBackendMigratorTest, + InitialMigrationForSyncingUserShouldMoveLocalOnlyDataToAndroidBackend) { + feature_list().InitAndEnableFeatureWithParameters( + /*enabled_feature=*/features::kUnifiedPasswordManagerMigration, + {{"migration_version", "1"}}); + EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) + .WillRepeatedly(Return(true)); + + Init(); + PasswordForm form = CreateTestPasswordForm(); + android_backend().AddLoginAsync(form, base::DoNothing()); + + // 'skip_zero_click' is a local only field in PasswordForm and hence not + // available in Android backend before the migration. + PasswordForm form_with_local_data = form; + form_with_local_data.skip_zero_click = true; + built_in_backend().AddLoginAsync(form_with_local_data, base::DoNothing()); + + migrator()->StartMigrationIfNecessary(); + RunUntilIdle(); + + base::MockCallback<LoginsOrErrorReply> mock_reply; + std::vector<std::unique_ptr<PasswordForm>> expected_logins_android_backend; + expected_logins_android_backend.push_back( + std::make_unique<PasswordForm>(form_with_local_data)); + EXPECT_CALL(mock_reply, + Run(LoginsResultsOrErrorAre(&expected_logins_android_backend))); + android_backend().GetAllLoginsAsync(mock_reply.Get()); + RunUntilIdle(); +} + // Holds the built in and android backend's logins and the expected result after // the migration. struct MigrationParam { @@ -299,7 +321,7 @@ BuiltInBackendToAndroidBackendMigratorTest::Init(); EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); + .WillRepeatedly(Return(false)); feature_list().InitAndEnableFeatureWithParameters( /*enabled_feature=*/features::kUnifiedPasswordManagerMigration, @@ -339,9 +361,6 @@ BuiltInBackendToAndroidBackendMigratorTest::Init( /*current_migration_version=*/1); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(true)); - const MigrationParam& p = GetParam(); for (const auto& login : p.GetBuiltInLogins()) { @@ -448,8 +467,18 @@ MigrationMetricsTest) { base::HistogramTester histogram_tester; - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); + if (GetParam().is_initial_migration) { + // During initial migration we query the sync status to decide whether run + // the code for migrating local-only data to Android backend. + EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) + .WillRepeatedly(Return(false)); + // During successful initial migration we query the sync status to decide + // whether sync metadata should be deleted. + if (GetParam().is_successful_migration) { + EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) + .WillRepeatedly(Return(false)); + } + } EXPECT_CALL(built_in_backend_, GetAllLoginsAsync) .WillOnce(WithArg<0>(Invoke([](LoginsOrErrorReply reply) -> void { @@ -519,8 +548,11 @@ TEST_F(BuiltInBackendToAndroidBackendMigratorWithMockAndroidBackendTest, ShouldNotCompleteMigrationWhenWritingToAndroidBackendFails) { + // Sync state doesn't affect this test, run it arbitrarily for non-sync'ing + // users. EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(false)); + .WillRepeatedly(Return(false)); + // Add two credentials to the built-in backend. built_in_backend().AddLoginAsync(CreateTestPasswordForm(/*index=*/1), base::DoNothing());
diff --git a/components/policy/core/browser/webui/machine_level_user_cloud_policy_status_provider.cc b/components/policy/core/browser/webui/machine_level_user_cloud_policy_status_provider.cc index 95ad65c4..ac175159 100644 --- a/components/policy/core/browser/webui/machine_level_user_cloud_policy_status_provider.cc +++ b/components/policy/core/browser/webui/machine_level_user_cloud_policy_status_provider.cc
@@ -63,9 +63,9 @@ if (policy) { dict->SetStringKey( "timeSinceLastRefresh", - GetTimeSinceLastActionString(refresh_scheduler - ? refresh_scheduler->last_refresh() - : base::Time())); + GetTimeSinceLastRefreshString(refresh_scheduler + ? refresh_scheduler->last_refresh() + : base::Time())); dict->SetStringKey("domain", gaia::ExtractDomainName(policy->username())); } } @@ -77,7 +77,7 @@ context_->lastCloudReportSent)); dict->SetStringKey( "timeSinceLastCloudReportSent", - GetTimeSinceLastActionString(context_->lastCloudReportSent)); + GetTimeSinceLastRefreshString(context_->lastCloudReportSent)); } }
diff --git a/components/policy/core/browser/webui/policy_status_provider.cc b/components/policy/core/browser/webui/policy_status_provider.cc index 826c8d7f..a228473 100644 --- a/components/policy/core/browser/webui/policy_status_provider.cc +++ b/components/policy/core/browser/webui/policy_status_provider.cc
@@ -95,6 +95,14 @@ refresh_scheduler ? refresh_scheduler->GetActualRefreshDelay() : CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs); + // In case state_keys aren't available, we have no scheduler. See also + // DeviceCloudPolicyInitializer::TryToCreateClient and b/181140445 + base::Time last_refresh_time = + refresh_scheduler ? refresh_scheduler->last_refresh() + : policy && policy->has_timestamp() + ? base::Time::FromJavaTime(policy->timestamp()) + : base::Time(); + bool no_error = store->status() == CloudPolicyStore::STATUS_OK && client && client->status() == DM_STATUS_SUCCESS; dict->SetBoolKey("error", !no_error); @@ -106,19 +114,8 @@ "refreshInterval", ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_DURATION, ui::TimeFormat::LENGTH_SHORT, refresh_interval)); - base::Time last_refresh_time = - policy && policy->has_timestamp() - ? base::Time::FromJavaTime(policy->timestamp()) - : base::Time(); dict->SetStringKey("timeSinceLastRefresh", - GetTimeSinceLastActionString(last_refresh_time)); - - // In case state_keys aren't available, we have no scheduler. See also - // DeviceCloudPolicyInitializer::TryToCreateClient and b/181140445. - base::Time last_fetch_attempted_time = - refresh_scheduler ? refresh_scheduler->last_refresh() : base::Time(); - dict->SetStringKey("timeSinceLastFetchAttempt", - GetTimeSinceLastActionString(last_fetch_attempted_time)); + GetTimeSinceLastRefreshString(last_refresh_time)); } // static @@ -159,14 +156,14 @@ } // static -std::u16string PolicyStatusProvider::GetTimeSinceLastActionString( - base::Time last_action_time) { - if (last_action_time.is_null()) +std::u16string PolicyStatusProvider::GetTimeSinceLastRefreshString( + base::Time last_refresh_time) { + if (last_refresh_time.is_null()) return l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED); base::Time now = GetClock()->Now(); base::TimeDelta elapsed_time; - if (now > last_action_time) - elapsed_time = now - last_action_time; + if (now > last_refresh_time) + elapsed_time = now - last_refresh_time; return ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT, elapsed_time); }
diff --git a/components/policy/core/browser/webui/policy_status_provider.h b/components/policy/core/browser/webui/policy_status_provider.h index 8faabf3b..91384b19 100644 --- a/components/policy/core/browser/webui/policy_status_provider.h +++ b/components/policy/core/browser/webui/policy_status_provider.h
@@ -57,7 +57,7 @@ void NotifyStatusChange(); static std::u16string GetPolicyStatusFromStore(const CloudPolicyStore*, const CloudPolicyClient*); - static std::u16string GetTimeSinceLastActionString(base::Time); + static std::u16string GetTimeSinceLastRefreshString(base::Time); private: base::RepeatingClosure callback_;
diff --git a/components/policy/core/common/config_dir_policy_loader.cc b/components/policy/core/common/config_dir_policy_loader.cc index 4bf685c..4dcab62e 100644 --- a/components/policy/core/common/config_dir_policy_loader.cc +++ b/components/policy/core/common/config_dir_policy_loader.cc
@@ -138,8 +138,9 @@ // to existing keys, but the ConfigDirPolicyProvider gives priority to the // last file in lexicographic order. for (const base::FilePath& config_file : base::Reversed(files)) { - JSONFileValueDeserializer deserializer(config_file, - base::JSON_ALLOW_TRAILING_COMMAS); + JSONFileValueDeserializer deserializer( + config_file, base::JSON_PARSE_CHROMIUM_EXTENSIONS | + base::JSON_ALLOW_TRAILING_COMMAS); int error_code = 0; std::string error_msg; std::unique_ptr<base::Value> value =
diff --git a/components/policy/core/common/config_dir_policy_loader_unittest.cc b/components/policy/core/common/config_dir_policy_loader_unittest.cc index b9b40e9..e20ab8b3 100644 --- a/components/policy/core/common/config_dir_policy_loader_unittest.cc +++ b/components/policy/core/common/config_dir_policy_loader_unittest.cc
@@ -19,7 +19,9 @@ #include "components/policy/core/common/configuration_policy_provider_test.h" #include "components/policy/core/common/policy_bundle.h" #include "components/policy/core/common/policy_map.h" +#include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_types.h" +#include "components/policy/policy_constants.h" #include "components/strings/grit/components_strings.h" namespace policy { @@ -28,6 +30,12 @@ // Subdirectory of the config dir that contains mandatory policies. const base::FilePath::CharType kMandatoryPath[] = FILE_PATH_LITERAL("managed"); +// The policy input supports trailing comma and c++ styled comments. +const char PolicyWithQuirks[] = R"({ + // Some comments here. + "HomepageIsNewTabPage": true, + /* Some more comments here */ +})"; class TestHarness : public PolicyProviderTestHarness { public: @@ -60,9 +68,10 @@ // JSON-encode a dictionary and write it to a file. void WriteConfigFile(const base::DictionaryValue& dict, const std::string& file_name); + void WriteConfigFile(const std::string& data, const std::string& file_name); - // Returns a unique name for a policy file. Each subsequent call returns a new - // name that comes lexicographically after the previous one. + // Returns a unique name for a policy file. Each subsequent call returns a + // new name that comes lexicographically after the previous one. std::string NextConfigFileName(); static PolicyProviderTestHarness* Create(); @@ -143,10 +152,15 @@ std::string data; JSONStringValueSerializer serializer(&data); serializer.Serialize(dict); + WriteConfigFile(data, file_name); +} + +void TestHarness::WriteConfigFile(const std::string& data, + const std::string& file_name) { const base::FilePath mandatory_dir(test_dir().Append(kMandatoryPath)); ASSERT_TRUE(base::CreateDirectory(mandatory_dir)); const base::FilePath file_path(mandatory_dir.AppendASCII(file_name)); - ASSERT_EQ((int) data.size(), + ASSERT_EQ((int)data.size(), base::WriteFile(file_path, data.c_str(), data.size())); } @@ -208,6 +222,21 @@ EXPECT_TRUE(bundle->Equals(kEmptyBundle)); } +TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsWithComments) { + harness_.WriteConfigFile(PolicyWithQuirks, "policies.json"); + ConfigDirPolicyLoader loader(task_environment_.GetMainThreadTaskRunner(), + harness_.test_dir(), POLICY_SCOPE_MACHINE); + std::unique_ptr<PolicyBundle> bundle(loader.Load()); + ASSERT_TRUE(bundle.get()); + PolicyBundle expected_bundle; + expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) + .Set(key::kHomepageIsNewTabPage, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM, base::Value(true), + /*external_data_fetcher=*/nullptr); + + EXPECT_TRUE(bundle->Equals(expected_bundle)); +} + // Test merging values from different files. TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsMergePrefs) { // Write a bunch of data files in order to increase the chance to detect the
diff --git a/components/policy/core/common/policy_scheduler.cc b/components/policy/core/common/policy_scheduler.cc index e7e94b0..517acef 100644 --- a/components/policy/core/common/policy_scheduler.cc +++ b/components/policy/core/common/policy_scheduler.cc
@@ -58,7 +58,6 @@ overlap_ = false; task_in_progress_ = true; - last_refresh_attempt_ = base::Time::Now(); task_.Run(base::BindOnce(&PolicyScheduler::OnTaskDone, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/components/policy/core/common/policy_scheduler.h b/components/policy/core/common/policy_scheduler.h index fe3fcadf..244b4bbe 100644 --- a/components/policy/core/common/policy_scheduler.h +++ b/components/policy/core/common/policy_scheduler.h
@@ -54,8 +54,6 @@ base::TimeDelta interval() const { return interval_; } - base::Time last_refresh_attempt() const { return last_refresh_attempt_; } - private: // Schedules next task to run in |delay|. Deletes any previously scheduled // tasks. @@ -86,9 +84,6 @@ // End time of the previous task. Zero in case no task has ended yet. base::TimeTicks last_task_; - // Last time refresh has been attempted. - base::Time last_refresh_attempt_; - std::unique_ptr<base::CancelableOnceClosure> job_; SEQUENCE_CHECKER(sequence_checker_);
diff --git a/components/policy/resources/webui/policy.html b/components/policy/resources/webui/policy.html index ae6be99..ff6677d6 100644 --- a/components/policy/resources/webui/policy.html +++ b/components/policy/resources/webui/policy.html
@@ -92,10 +92,6 @@ <div class="directory-api-id"></div> </div> <div class="status-entry" hidden> - <div class="label">$i18n{labelTimeSinceLastFetchAttempt}</div> - <div class="time-since-last-fetch-attempt"></div> - </div> - <div class="status-entry" hidden> <div class="label">$i18n{labelTimeSinceLastRefresh}</div> <div class="time-since-last-refresh"></div> </div>
diff --git a/components/policy/resources/webui/policy_base.js b/components/policy/resources/webui/policy_base.js index 143e13c..18eccf6 100644 --- a/components/policy/resources/webui/policy_base.js +++ b/components/policy/resources/webui/policy_base.js
@@ -178,11 +178,6 @@ this.setLabelAndShow_('.managed-by', status.enterpriseDomainManager); } - if (status.timeSinceLastFetchAttempt) { - this.setLabelAndShow_( - '.time-since-last-fetch-attempt', status.timeSinceLastFetchAttempt); - } - if (status.timeSinceLastRefresh) { this.setLabelAndShow_( '.time-since-last-refresh', status.timeSinceLastRefresh);
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp index c81e232..2812264b 100644 --- a/components/policy_strings.grdp +++ b/components/policy_strings.grdp
@@ -367,11 +367,8 @@ <message name="IDS_POLICY_LABEL_MANAGED_BY" desc="Label for the manager in the policy status boxes. Manager can be a domain or an email address."> Managed by: </message> - <message name="IDS_POLICY_LABEL_TIME_SINCE_LAST_FETCH_ATTEMPT" desc="Label for the time since the last fetch attempt in the policy status boxes."> - Last fetch attempted: - </message> <message name="IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH" desc="Label for the time since the last refresh in the policy status boxes."> - Last policy timestamp: + Last fetched: </message> <message name="IDS_POLICY_LABEL_LAST_CLOUD_REPORT_SENT_TIMESTAMP" desc="Label for the time when the last cloud report is sent successfully."> Report sent:
diff --git a/components/policy_strings_grdp/IDS_POLICY_LABEL_TIME_SINCE_LAST_FETCH_ATTEMPT.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_LABEL_TIME_SINCE_LAST_FETCH_ATTEMPT.png.sha1 deleted file mode 100644 index 3aac958c..0000000 --- a/components/policy_strings_grdp/IDS_POLICY_LABEL_TIME_SINCE_LAST_FETCH_ATTEMPT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -622d1ba2f7b18dc256c2eef33e899ff71b34a707 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH.png.sha1 deleted file mode 100644 index b99c202..0000000 --- a/components/policy_strings_grdp/IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -ae102fe49a0c7d00f772f0e4b77d4f93544f0dfb \ No newline at end of file
diff --git a/components/sync/driver/sync_service_crypto_unittest.cc b/components/sync/driver/sync_service_crypto_unittest.cc index ecaac7f..d74978bf 100644 --- a/components/sync/driver/sync_service_crypto_unittest.cc +++ b/components/sync/driver/sync_service_crypto_unittest.cc
@@ -536,7 +536,7 @@ // Mimic the engine determining that a passphrase is required. EXPECT_CALL(delegate_, ReconfigureDataTypesDueToCrypto()); // There should be no attempt to populate wrong key to the |engine_|. - EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey(_)).Times(0); + EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey).Times(0); crypto_.OnPassphraseRequired( KeyDerivationParams::CreateForPbkdf2(), MakeEncryptedData(kTestPassphrase, @@ -569,7 +569,7 @@ // Mimic the engine determining that a passphrase is required. EXPECT_CALL(delegate_, ReconfigureDataTypesDueToCrypto()); // There should be no attempt to populate wrong key to the |engine_|. - EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey(_)).Times(0); + EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey).Times(0); crypto_.OnPassphraseRequired( KeyDerivationParams::CreateForPbkdf2(), MakeEncryptedData(kTestPassphrase, @@ -607,7 +607,7 @@ // Passing wrong decryption key should be ignored. EXPECT_CALL(delegate_, ReconfigureDataTypesDueToCrypto()).Times(0); EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey).Times(0); - EXPECT_CALL(delegate_, SetEncryptionBootstrapToken(_)).Times(0); + EXPECT_CALL(delegate_, SetEncryptionBootstrapToken).Times(0); crypto_.SetDecryptionNigoriKey(Nigori::CreateByDerivation( KeyDerivationParams::CreateForPbkdf2(), "wrongpassphrase")); EXPECT_TRUE(crypto_.IsPassphraseRequired()); @@ -636,7 +636,7 @@ EXPECT_CALL(delegate_, ReconfigureDataTypesDueToCrypto()).Times(0); EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey).Times(0); - EXPECT_CALL(delegate_, SetEncryptionBootstrapToken(_)).Times(0); + EXPECT_CALL(delegate_, SetEncryptionBootstrapToken).Times(0); crypto_.SetDecryptionNigoriKey(Nigori::CreateByDerivation( KeyDerivationParams::CreateForPbkdf2(), "unexpected_passphrase")); EXPECT_FALSE(crypto_.IsPassphraseRequired());
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc index fdd1a19..06ef7bb 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc
@@ -158,11 +158,11 @@ // To avoid DCHECK failures in tests that exercise SetPrimaryAccount(), // return non-null for RegisterAuthenticationFactor(). This registration // operation will never complete, though. - ON_CALL(*connection_, RegisterAuthenticationFactor(_, _, _, _, _, _, _)) + ON_CALL(*connection_, RegisterAuthenticationFactor) .WillByDefault(testing::InvokeWithoutArgs([&]() { return std::make_unique<TrustedVaultConnection::Request>(); })); - ON_CALL(*connection_, RegisterDeviceWithoutKeys(_, _, _)) + ON_CALL(*connection_, RegisterDeviceWithoutKeys) .WillByDefault(testing::InvokeWithoutArgs([&]() { return std::make_unique<TrustedVaultConnection::Request>(); })); @@ -665,9 +665,8 @@ backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); ASSERT_TRUE(backend()->MarkLocalKeysAsStale(account_info)); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) - .Times(0); - EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys(_, _, _)).Times(0); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); + EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys).Times(0); base::HistogramTester histogram_tester; backend()->SetPrimaryAccount(account_info, @@ -724,9 +723,8 @@ .device_registered()); // The device should not register again. - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) - .Times(0); - EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys(_, _, _)).Times(0); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); + EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys).Times(0); base::HistogramTester histogram_tester; backend()->SetPrimaryAccount(account_info, @@ -748,7 +746,7 @@ backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); TrustedVaultConnection::RegisterAuthenticationFactorCallback device_registration_callback; - ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) + ON_CALL(*connection(), RegisterAuthenticationFactor) .WillByDefault( [&](const CoreAccountInfo&, const std::vector<std::vector<uint8_t>>&, int, const SecureBoxPublicKey&, AuthenticationFactorType, @@ -759,7 +757,7 @@ return std::make_unique<TrustedVaultConnection::Request>(); }); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor); // Setting the primary account will trigger device registration. backend()->SetPrimaryAccount(account_info, /*has_persistent_auth_error=*/false); @@ -774,8 +772,7 @@ // throttled. base::HistogramTester histogram_tester; ResetBackend(); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) - .Times(0); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); backend()->ReadDataFromDisk(); backend()->SetPrimaryAccount(account_info, /*has_persistent_auth_error=*/false); @@ -789,7 +786,7 @@ // registration attempt, which should now be unthrottled. base::HistogramTester histogram_tester2; ResetBackend(); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor); clock()->Advance(kTrustedVaultServiceThrottlingDuration.Get()); backend()->ReadDataFromDisk(); backend()->SetPrimaryAccount(account_info, @@ -811,7 +808,7 @@ backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); TrustedVaultConnection::RegisterAuthenticationFactorCallback device_registration_callback; - ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) + ON_CALL(*connection(), RegisterAuthenticationFactor) .WillByDefault( [&](const CoreAccountInfo&, const std::vector<std::vector<uint8_t>>&, int, const SecureBoxPublicKey&, AuthenticationFactorType, @@ -822,7 +819,7 @@ return std::make_unique<TrustedVaultConnection::Request>(); }); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor); // Setting the primary account will trigger device registration. backend()->SetPrimaryAccount(account_info, /*has_persistent_auth_error=*/false); @@ -836,7 +833,7 @@ // Mimic a restart to trigger device registration attempt, which should not be // throttled. ResetBackend(); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor); backend()->ReadDataFromDisk(); backend()->SetPrimaryAccount(account_info, /*has_persistent_auth_error=*/false); @@ -853,7 +850,7 @@ backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); TrustedVaultConnection::RegisterAuthenticationFactorCallback device_registration_callback; - ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) + ON_CALL(*connection(), RegisterAuthenticationFactor) .WillByDefault( [&](const CoreAccountInfo&, const std::vector<std::vector<uint8_t>>&, int, const SecureBoxPublicKey&, AuthenticationFactorType, @@ -866,7 +863,7 @@ clock()->SetNow(base::Time::Now()); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor); // Setting the primary account will trigger device registration. backend()->SetPrimaryAccount(account_info, /*has_persistent_auth_error=*/false); @@ -882,7 +879,7 @@ device_registration_callback = TrustedVaultConnection::RegisterAuthenticationFactorCallback(); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor); // Reset and set primary account to trigger device registration attempt. backend()->SetPrimaryAccount(absl::nullopt, /*has_persistent_auth_error=*/false); @@ -978,7 +975,7 @@ /*has_persistent_auth_error=*/false); TrustedVaultConnection::DownloadNewKeysCallback download_keys_callback; - ON_CALL(*connection(), DownloadNewKeys(_, _, _, _)) + ON_CALL(*connection(), DownloadNewKeys) .WillByDefault( [&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, @@ -989,7 +986,7 @@ }); clock()->SetNow(base::Time::Now()); - EXPECT_CALL(*connection(), DownloadNewKeys(_, _, _, _)); + EXPECT_CALL(*connection(), DownloadNewKeys); // FetchKeys() should trigger keys downloading. backend()->FetchKeys(account_info, /*callback=*/base::DoNothing()); @@ -1003,7 +1000,7 @@ /*last_key_version=*/0); download_keys_callback = TrustedVaultConnection::DownloadNewKeysCallback(); - EXPECT_CALL(*connection(), DownloadNewKeys(_, _, _, _)).Times(0); + EXPECT_CALL(*connection(), DownloadNewKeys).Times(0); // Following request should be throttled. backend()->FetchKeys(account_info, /*callback=*/base::DoNothing()); EXPECT_TRUE(download_keys_callback.is_null()); @@ -1012,7 +1009,7 @@ // Advance time to pass the throttling duration and trigger another attempt. clock()->Advance(kTrustedVaultServiceThrottlingDuration.Get()); - EXPECT_CALL(*connection(), DownloadNewKeys(_, _, _, _)); + EXPECT_CALL(*connection(), DownloadNewKeys); backend()->FetchKeys(account_info, /*callback=*/base::DoNothing()); EXPECT_FALSE(download_keys_callback.is_null()); } @@ -1140,8 +1137,7 @@ /*has_persistent_auth_error=*/false); backend()->StoreKeys(account_info.gaia, kVaultKeys, kLastKeyVersion); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) - .Times(0); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); base::MockCallback<base::OnceClosure> completion_callback; EXPECT_CALL(completion_callback, Run()); @@ -1163,8 +1159,7 @@ // No request should be issued while there is no primary account. base::MockCallback<base::OnceClosure> completion_callback; - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _, _)) - .Times(0); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); backend()->AddTrustedRecoveryMethod(account_info.gaia, kPublicKey, kMethodTypeHint, completion_callback.Get());
diff --git a/components/sync/trusted_vault/trusted_vault_request_unittest.cc b/components/sync/trusted_vault/trusted_vault_request_unittest.cc index 3f6fa71..9905515 100644 --- a/components/sync/trusted_vault/trusted_vault_request_unittest.cc +++ b/components/sync/trusted_vault/trusted_vault_request_unittest.cc
@@ -286,7 +286,7 @@ /*request_body=*/absl::nullopt, completion_callback.Get()); // Mimic network change error for the first request. - EXPECT_CALL(completion_callback, Run(_, _)).Times(0); + EXPECT_CALL(completion_callback, Run).Times(0); EXPECT_TRUE(RespondToHttpRequest(net::ERR_NETWORK_CHANGED, net::HTTP_OK, /*response_body=*/"")); testing::Mock::VerifyAndClearExpectations(&completion_callback);
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc index ff8c073..2fe6f05 100644 --- a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc +++ b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
@@ -283,9 +283,9 @@ std::unique_ptr<bookmarks::BookmarkModel> model = bookmarks::TestBookmarkClient::CreateModel(); testing::NiceMock<favicon::MockFaviconService> favicon_service; - EXPECT_CALL(favicon_service, AddPageNoVisitForBookmark(_, _)).Times(0); - EXPECT_CALL(favicon_service, MergeFavicon(_, _, _, _, _)).Times(0); - EXPECT_CALL(favicon_service, DeleteFaviconMappings(_, _)).Times(0); + EXPECT_CALL(favicon_service, AddPageNoVisitForBookmark).Times(0); + EXPECT_CALL(favicon_service, MergeFavicon).Times(0); + EXPECT_CALL(favicon_service, DeleteFaviconMappings).Times(0); base::HistogramTester histogram_tester; const bookmarks::BookmarkNode* node = CreateBookmarkNodeFromSpecifics( bm_specifics,
diff --git a/components/user_notes/BUILD.gn b/components/user_notes/BUILD.gn new file mode 100644 index 0000000..ba65e9f6 --- /dev/null +++ b/components/user_notes/BUILD.gn
@@ -0,0 +1,12 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +static_library("features") { + sources = [ + "user_notes_features.cc", + "user_notes_features.h", + ] + + deps = [ "//base" ] +}
diff --git a/components/user_notes/DEPS b/components/user_notes/DEPS new file mode 100644 index 0000000..f0bf3d9 --- /dev/null +++ b/components/user_notes/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+components/keyed_service/core", +]
diff --git a/components/user_notes/DIR_METADATA b/components/user_notes/DIR_METADATA new file mode 100644 index 0000000..41d1f6aa --- /dev/null +++ b/components/user_notes/DIR_METADATA
@@ -0,0 +1,5 @@ +monorail { + component: "UI>Browser>Creation" +} + +team_email: "chrome-creation@google.com"
diff --git a/components/user_notes/OWNERS b/components/user_notes/OWNERS new file mode 100644 index 0000000..fa6f7875 --- /dev/null +++ b/components/user_notes/OWNERS
@@ -0,0 +1,3 @@ +bokan@chromium.org +gujen@google.com +sebsg@chromium.org
diff --git a/components/user_notes/README.md b/components/user_notes/README.md new file mode 100644 index 0000000..ede064b --- /dev/null +++ b/components/user_notes/README.md
@@ -0,0 +1,14 @@ +# User Notes Component + +This directory contains cross-platform business logic for the User Notes +feature. + +## Directory structure + +- `browser/` + - Contains business logic classes that live in the browser process. +- `model/` + - Contains model classes that represent core concepts of the User Notes + feature, such as a note's metadata, a note's target, a note's body, etc. +- `storage/` + - Contains classes related to storage and Sync for the notes.
diff --git a/components/user_notes/browser/BUILD.gn b/components/user_notes/browser/BUILD.gn new file mode 100644 index 0000000..f6b8f3c --- /dev/null +++ b/components/user_notes/browser/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +static_library("browser") { + sources = [ + "user_note_service.cc", + "user_note_service.h", + "user_notes_ui_delegate.h", + ] + + deps = [ + "//components/keyed_service/core", + "//components/user_notes:features", + ] +}
diff --git a/components/user_notes/browser/user_note_service.cc b/components/user_notes/browser/user_note_service.cc new file mode 100644 index 0000000..8ddc15d2 --- /dev/null +++ b/components/user_notes/browser/user_note_service.cc
@@ -0,0 +1,32 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/user_notes/browser/user_note_service.h" + +#include "base/notreached.h" +#include "components/user_notes/user_notes_features.h" + +namespace user_notes { + +UserNoteService::UserNoteService() = default; + +UserNoteService::~UserNoteService() = default; + +void UserNoteService::OnNoteFocused(std::string guid) { + DCHECK(IsUserNotesEnabled()); + NOTIMPLEMENTED(); +} + +void UserNoteService::OnNoteCreationDone(std::string guid, + std::string note_content) { + DCHECK(IsUserNotesEnabled()); + NOTIMPLEMENTED(); +} + +void UserNoteService::OnNoteCreationCancelled(std::string guid) { + DCHECK(IsUserNotesEnabled()); + NOTIMPLEMENTED(); +} + +} // namespace user_notes
diff --git a/components/user_notes/browser/user_note_service.h b/components/user_notes/browser/user_note_service.h new file mode 100644 index 0000000..188846f --- /dev/null +++ b/components/user_notes/browser/user_note_service.h
@@ -0,0 +1,33 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_USER_NOTES_BROWSER_USER_NOTE_SERVICE_H_ +#define COMPONENTS_USER_NOTES_BROWSER_USER_NOTE_SERVICE_H_ + +#include "components/keyed_service/core/keyed_service.h" + +#include <string> + +#include "components/user_notes/browser/user_notes_ui_delegate.h" + +namespace user_notes { + +// Keyed service cooridnating the different parts (Renderer, UI layer, storage +// layer) of the User Notes feature for the current user profile. +class UserNoteService : public KeyedService, public UserNotesUIDelegate { + public: + explicit UserNoteService(); + ~UserNoteService() override; + UserNoteService(const UserNoteService&) = delete; + UserNoteService& operator=(const UserNoteService&) = delete; + + // UserNotesUIDelegate implementation. + void OnNoteFocused(std::string guid) override; + void OnNoteCreationDone(std::string guid, std::string note_content) override; + void OnNoteCreationCancelled(std::string guid) override; +}; + +} // namespace user_notes + +#endif // COMPONENTS_USER_NOTES_BROWSER_USER_NOTE_SERVICE_H_
diff --git a/components/user_notes/browser/user_notes_ui_delegate.h b/components/user_notes/browser/user_notes_ui_delegate.h new file mode 100644 index 0000000..f7cfaf0d6 --- /dev/null +++ b/components/user_notes/browser/user_notes_ui_delegate.h
@@ -0,0 +1,34 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_USER_NOTES_BROWSER_USER_NOTES_UI_DELEGATE_H_ +#define COMPONENTS_USER_NOTES_BROWSER_USER_NOTES_UI_DELEGATE_H_ + +#include <string> + +namespace user_notes { + +// Interface used by the UI layer (e.g. Side Panel on desktop) to delegate +// handling for some note-specific user actions. +class UserNotesUIDelegate { + public: + UserNotesUIDelegate() = default; + UserNotesUIDelegate(const UserNotesUIDelegate&) = delete; + UserNotesUIDelegate& operator=(const UserNotesUIDelegate&) = delete; + virtual ~UserNotesUIDelegate() = default; + + // Called when a note in the UI is focused. + virtual void OnNoteFocused(std::string guid) = 0; + + // Called when the user successfully creates a new note in the UI. + virtual void OnNoteCreationDone(std::string guid, + std::string note_content) = 0; + + // Called when the user aborts the note creation process in the UI. + virtual void OnNoteCreationCancelled(std::string guid) = 0; +}; + +} // namespace user_notes + +#endif // COMPONENTS_USER_NOTES_BROWSER_USER_NOTES_UI_DELEGATE_H_
diff --git a/components/user_notes/model/BUILD.gn b/components/user_notes/model/BUILD.gn new file mode 100644 index 0000000..258e470 --- /dev/null +++ b/components/user_notes/model/BUILD.gn
@@ -0,0 +1,10 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +static_library("model") { + sources = [ + "user_note.cc", + "user_note.h", + ] +}
diff --git a/components/user_notes/model/user_note.cc b/components/user_notes/model/user_note.cc new file mode 100644 index 0000000..9019ca2 --- /dev/null +++ b/components/user_notes/model/user_note.cc
@@ -0,0 +1,13 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/user_notes/model/user_note.h" + +namespace user_notes { + +UserNote::UserNote(const std::string& guid) : guid_(guid) {} + +UserNote::~UserNote() = default; + +} // namespace user_notes
diff --git a/components/user_notes/model/user_note.h b/components/user_notes/model/user_note.h new file mode 100644 index 0000000..852de08 --- /dev/null +++ b/components/user_notes/model/user_note.h
@@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_USER_NOTES_MODEL_USER_NOTE_H_ +#define COMPONENTS_USER_NOTES_MODEL_USER_NOTE_H_ + +#include <string> + +namespace user_notes { + +// Model class for a note. +class UserNote { + public: + explicit UserNote(const std::string& guid); + ~UserNote(); + UserNote(const UserNote&) = delete; + UserNote& operator=(const UserNote&) = delete; + + const std::string& guid() const { return guid_; } + + private: + // The unique (among the user's notes) ID for this note. + std::string guid_; +}; + +} // namespace user_notes + +#endif // COMPONENTS_USER_NOTES_MODEL_USER_NOTE_H_
diff --git a/components/user_notes/user_notes_features.cc b/components/user_notes/user_notes_features.cc new file mode 100644 index 0000000..61922f2 --- /dev/null +++ b/components/user_notes/user_notes_features.cc
@@ -0,0 +1,15 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/user_notes/user_notes_features.h" + +namespace user_notes { + +const base::Feature kUserNotes{"UserNotes", base::FEATURE_DISABLED_BY_DEFAULT}; + +bool IsUserNotesEnabled() { + return base::FeatureList::IsEnabled(kUserNotes); +} + +} // namespace user_notes
diff --git a/components/user_notes/user_notes_features.h b/components/user_notes/user_notes_features.h new file mode 100644 index 0000000..589b683e --- /dev/null +++ b/components/user_notes/user_notes_features.h
@@ -0,0 +1,20 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_USER_NOTES_USER_NOTES_FEATURES_H_ +#define COMPONENTS_USER_NOTES_USER_NOTES_FEATURES_H_ + +#include "base/feature_list.h" + +namespace user_notes { + +// Feature controlling the User Notes feature on desktop platforms. +extern const base::Feature kUserNotes; + +// Returns true if the User Notes feature is enabled. +bool IsUserNotesEnabled(); + +} // namespace user_notes + +#endif // COMPONENTS_USER_NOTES_USER_NOTES_FEATURES_H_
diff --git a/components/viz/service/display/skia_readback_pixeltest.cc b/components/viz/service/display/skia_readback_pixeltest.cc index 5fe3f2e..c3bffea 100644 --- a/components/viz/service/display/skia_readback_pixeltest.cc +++ b/components/viz/service/display/skia_readback_pixeltest.cc
@@ -106,7 +106,7 @@ std::vector<GrBackendSemaphore> end_semaphores; auto scoped_write = representation->BeginScopedWriteAccess( - /*final_msaa_count=*/0, surface_props, &begin_semaphores, &end_semaphores, + /*final_msaa_count=*/1, surface_props, &begin_semaphores, &end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); auto* surface = scoped_write->surface();
diff --git a/components/viz/service/display_embedder/output_presenter.cc b/components/viz/service/display_embedder/output_presenter.cc index 0d9abbe5..33f793d 100644 --- a/components/viz/service/display_embedder/output_presenter.cc +++ b/components/viz/service/display_embedder/output_presenter.cc
@@ -58,7 +58,7 @@ // so allow uncleared access. // TODO(vasilyt): Props and MSAA scoped_skia_write_access_ = skia_representation_->BeginScopedWriteAccess( - 0 /* final_msaa_count */, surface_props, &begin_semaphores, + /*final_msaa_count=*/1, surface_props, &begin_semaphores, &end_semaphores_, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); DCHECK(scoped_skia_write_access_);
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index a9b094b..6f8d3d4b 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -958,7 +958,7 @@ !capabilities_.uses_default_gl_framebuffer); auto characterization = gr_context_thread_safe_->createCharacterization( cache_max_resource_bytes, image_info, backend_format, - 0 /* sampleCount */, surface_origin, surface_props, mipmap, + 1 /* sampleCount */, surface_origin, surface_props, mipmap, capabilities_.uses_default_gl_framebuffer, false /* isTextureable */, GrProtected::kNo, false /* vkRTSupportsInputAttachment */, capabilities_.root_is_vulkan_secondary_command_buffer); @@ -996,7 +996,7 @@ kPremul_SkAlphaType, std::move(color_space)); auto characterization = gr_context_thread_safe_->createCharacterization( - cache_max_resource_bytes, image_info, backend_format, 0 /* sampleCount */, + cache_max_resource_bytes, image_info, backend_format, 1 /* sampleCount */, kTopLeft_GrSurfaceOrigin, surface_props, mipmap, false /* willUseGLFBO0 */, true /* isTextureable */, GrProtected::kNo); DCHECK(characterization.isValid());
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc index 1a18309..946f4f40aa 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -561,8 +561,9 @@ std::vector<GrBackendSemaphore> begin_semaphores; std::vector<GrBackendSemaphore> end_semaphores; + const auto& characterization = ddl->characterization(); auto scoped_access = backing_representation->BeginScopedWriteAccess( - /*final_msaa_count=*/0, ddl->characterization().surfaceProps(), + characterization.sampleCount(), characterization.surfaceProps(), &begin_semaphores, &end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); if (!scoped_access) { @@ -703,7 +704,7 @@ std::vector<GrBackendSemaphore> end_semaphores; auto scoped_write = representation->BeginScopedWriteAccess( - 0 /* final_msaa_count */, surface_props, &begin_semaphores, + /*final_msaa_count=*/1, surface_props, &begin_semaphores, &end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); @@ -828,7 +829,7 @@ std::unique_ptr<gpu::SharedImageRepresentationSkia::ScopedWriteAccess> scoped_write = representation->BeginScopedWriteAccess( - /*final_msaa_count=*/0, surface_props, &plane_data.begin_semaphores, + /*final_msaa_count=*/1, surface_props, &plane_data.begin_semaphores, &plane_data.end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); SkSurface* dest_surface = scoped_write->surface(); @@ -870,7 +871,7 @@ std::unique_ptr<gpu::SharedImageRepresentationSkia::ScopedWriteAccess> scoped_write = representation->BeginScopedWriteAccess( - /*final_msaa_count=*/0, surface_props, &plane_data.begin_semaphores, + /*final_msaa_count=*/1, surface_props, &plane_data.begin_semaphores, &plane_data.end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); SkSurface* dest_surface = scoped_write->surface(); @@ -997,8 +998,7 @@ std::vector<GrBackendSemaphore> end_semaphores; auto scoped_write = representation->BeginScopedWriteAccess( - 0 /* final_msaa_count */, surface_props, &begin_semaphores, - &end_semaphores, + /*final_msaa_count=*/1, surface_props, &begin_semaphores, &end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); absl::optional<SkVector> scaling; @@ -1174,7 +1174,7 @@ SkSurfaceProps surface_props{0, kUnknown_SkPixelGeometry}; // TODO(https://crbug.com/1226672): Use BeginScopedReadAccess instead scoped_access = backing_representation->BeginScopedWriteAccess( - /*final_msaa_count=*/0, surface_props, &begin_semaphores, + /*final_msaa_count=*/1, surface_props, &begin_semaphores, &end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kNo); surface = scoped_access->surface(); @@ -1428,7 +1428,7 @@ DCHECK(overlay.mailbox.IsZero()); overlay.mailbox = backing->mailbox(); auto scoped_access = backing->BeginScopedWriteAccess( - /*final_msaa_count=*/0, characterization.surfaceProps(), + characterization.sampleCount(), characterization.surfaceProps(), /*begin_semaphores=*/nullptr, /*end_semaphores=*/nullptr, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes);
diff --git a/components/webapps/browser/android/app_banner_manager_android.cc b/components/webapps/browser/android/app_banner_manager_android.cc index edef9de..525a6fd 100644 --- a/components/webapps/browser/android/app_banner_manager_android.cc +++ b/components/webapps/browser/android/app_banner_manager_android.cc
@@ -518,7 +518,11 @@ void AppBannerManagerAndroid::MaybeShowAmbientBadge() { if (!base::FeatureList::IsEnabled( - features::kInstallableAmbientBadgeInfoBar)) { + features::kInstallableAmbientBadgeInfoBar) && + !base::FeatureList::IsEnabled( + features::kInstallableAmbientBadgeMessage) && + !base::FeatureList::IsEnabled( + messages::kMessagesForAndroidInfrastructure)) { return; }
diff --git a/components/webapps/browser/android/features.cc b/components/webapps/browser/android/features.cc index eaff933..658c012 100644 --- a/components/webapps/browser/android/features.cc +++ b/components/webapps/browser/android/features.cc
@@ -14,11 +14,11 @@ // Enables or disables the installable ambient badge infobar. const base::Feature kInstallableAmbientBadgeInfoBar{ - "InstallableAmbientBadgeInfoBar", base::FEATURE_ENABLED_BY_DEFAULT}; + "InstallableAmbientBadgeInfoBar", base::FEATURE_DISABLED_BY_DEFAULT}; // Enables or disables the installable ambient badge message. const base::Feature kInstallableAmbientBadgeMessage{ - "InstallableAmbientBadgeMessage", base::FEATURE_DISABLED_BY_DEFAULT}; + "InstallableAmbientBadgeMessage", base::FEATURE_ENABLED_BY_DEFAULT}; } // namespace features } // namespace webapps
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 240d301..92537e5 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -392,6 +392,8 @@ "attribution_reporting/attribution_data_host_manager_impl.h", "attribution_reporting/attribution_default_random_generator.cc", "attribution_reporting/attribution_default_random_generator.h", + "attribution_reporting/attribution_filter_data.cc", + "attribution_reporting/attribution_filter_data.h", "attribution_reporting/attribution_host.cc", "attribution_reporting/attribution_host.h", "attribution_reporting/attribution_host_utils.cc", @@ -2062,8 +2064,6 @@ "webid/federated_auth_request_service.h", "webid/flags.cc", "webid/flags.h", - "webid/id_token_request_callback_data.cc", - "webid/id_token_request_callback_data.h", "webid/idp_network_request_manager.cc", "webid/idp_network_request_manager.h", "webid/redirect_uri_data.cc", @@ -3118,6 +3118,13 @@ "profiling_utils.cc", ] } + + if (is_chromeos_lacros) { + sources += [ + "accessibility/browser_accessibility_state_impl_lacros.cc", + "accessibility/browser_accessibility_state_impl_lacros.h", + ] + } } if (is_android) {
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc index 7e47abd4..375cd67a 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -14,6 +14,7 @@ #include "base/no_destructor.h" #include "base/task/thread_pool.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_task_traits.h" @@ -68,8 +69,9 @@ return BrowserAccessibilityStateImpl::GetInstance(); } -// On Android, Mac, and Windows there are platform-specific subclasses. -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_MAC) +// On Android, Mac, Lacros, and Windows there are platform-specific subclasses. +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_MAC) && \ + !BUILDFLAG(IS_CHROMEOS_LACROS) // static BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() { static base::NoDestructor<BrowserAccessibilityStateImpl> instance;
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_lacros.cc b/content/browser/accessibility/browser_accessibility_state_impl_lacros.cc new file mode 100644 index 0000000..fdbcae74 --- /dev/null +++ b/content/browser/accessibility/browser_accessibility_state_impl_lacros.cc
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/accessibility/browser_accessibility_state_impl_lacros.h" + +#include "base/no_destructor.h" + +namespace content { + +BrowserAccessibilityStateImplLacros::BrowserAccessibilityStateImplLacros() + : crosapi_pref_observer_( + crosapi::mojom::PrefPath::kAccessibilitySpokenFeedbackEnabled, + base::BindRepeating( + &BrowserAccessibilityStateImplLacros::OnSpokenFeedbackPrefChanged, + base::Unretained(this))) {} + +BrowserAccessibilityStateImplLacros::~BrowserAccessibilityStateImplLacros() = + default; + +void BrowserAccessibilityStateImplLacros::OnSpokenFeedbackPrefChanged( + base::Value value) { + if (value.GetIfBool().value_or(false)) + AddAccessibilityModeFlags(ui::AXMode::kScreenReader); + else + RemoveAccessibilityModeFlags(ui::AXMode::kScreenReader); +} + +// static +BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() { + static base::NoDestructor<BrowserAccessibilityStateImplLacros> instance; + return &*instance; +} + +} // namespace content
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_lacros.h b/content/browser/accessibility/browser_accessibility_state_impl_lacros.h new file mode 100644 index 0000000..68c1588 --- /dev/null +++ b/content/browser/accessibility/browser_accessibility_state_impl_lacros.h
@@ -0,0 +1,33 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_STATE_IMPL_LACROS_H_ +#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_STATE_IMPL_LACROS_H_ + +#include "base/values.h" +#include "chromeos/lacros/crosapi_pref_observer.h" +#include "content/browser/accessibility/browser_accessibility_state_impl.h" + +namespace content { + +class BrowserAccessibilityStateImplLacros + : public BrowserAccessibilityStateImpl { + public: + BrowserAccessibilityStateImplLacros(); + ~BrowserAccessibilityStateImplLacros() override; + + BrowserAccessibilityStateImplLacros( + const BrowserAccessibilityStateImplLacros&) = delete; + BrowserAccessibilityStateImplLacros& operator=( + const BrowserAccessibilityStateImplLacros&) = delete; + + private: + void OnSpokenFeedbackPrefChanged(base::Value value); + + CrosapiPrefObserver crosapi_pref_observer_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_STATE_IMPL_LACROS_H_
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc index 47a224b..27a1b9e 100644 --- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc +++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -10,6 +10,7 @@ #include "base/check.h" #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_host_utils.h" #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/attribution_reporting.pb.h" @@ -27,26 +28,6 @@ namespace { -bool IsFilterDataValid(const blink::mojom::AttributionFilterData& filter_data) { - if (filter_data.filter_values.size() > blink::kMaxAttributionFiltersPerSource) - return false; - - for (const auto& [filter, values] : filter_data.filter_values) { - if (filter.size() > blink::kMaxBytesPerAttributionFilterString) - return false; - - if (values.size() > blink::kMaxValuesPerAttributionFilter) - return false; - - for (const auto& value : values) { - if (value.size() > blink::kMaxBytesPerAttributionFilterString) - return false; - } - } - - return true; -} - proto::AttributionAggregatableSources ConvertToProto( const blink::mojom::AttributionAggregatableSources& aggregatable_sources) { proto::AttributionAggregatableSources result; @@ -123,7 +104,10 @@ return; } - if (!IsFilterDataValid(*data->filter_data)) + absl::optional<AttributionFilterData> filter_data = + AttributionFilterData::FromFilterValues( + std::move(data->filter_data->filter_values)); + if (!filter_data.has_value()) return; absl::optional<AttributionAggregatableSources> aggregatable_sources = @@ -137,7 +121,7 @@ reporting_origin, source_time, CommonSourceInfo::GetExpiryTime(data->expiry, source_time, context.source_type), - context.source_type, data->priority, + context.source_type, data->priority, std::move(*filter_data), data->debug_key ? absl::make_optional(data->debug_key->value) : absl::nullopt, std::move(*aggregatable_sources)));
diff --git a/content/browser/attribution_reporting/attribution_filter_data.cc b/content/browser/attribution_reporting/attribution_filter_data.cc new file mode 100644 index 0000000..105d63d --- /dev/null +++ b/content/browser/attribution_reporting/attribution_filter_data.cc
@@ -0,0 +1,99 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/attribution_reporting/attribution_filter_data.h" + +#include <iterator> +#include <utility> + +#include "base/check.h" +#include "base/check_op.h" +#include "content/browser/attribution_reporting/attribution_reporting.pb.h" +#include "third_party/blink/public/common/attribution_reporting/constants.h" + +namespace content { + +// static +absl::optional<AttributionFilterData> AttributionFilterData::Deserialize( + const std::string& string) { + proto::AttributionFilterData msg; + if (!msg.ParseFromString(string)) + return absl::nullopt; + + FilterValues::container_type filter_values; + filter_values.reserve(msg.filter_values().size()); + + for (google::protobuf::MapPair<std::string, proto::AttributionFilterValues>& + entry : *msg.mutable_filter_values()) { + google::protobuf::RepeatedPtrField<std::string>* values = + entry.second.mutable_values(); + + filter_values.emplace_back( + entry.first, + std::vector<std::string>(std::make_move_iterator(values->begin()), + std::make_move_iterator(values->end()))); + } + + return AttributionFilterData::FromFilterValues(std::move(filter_values)); +} + +// static +absl::optional<AttributionFilterData> AttributionFilterData::FromFilterValues( + FilterValues&& filter_values) { + if (filter_values.size() > blink::kMaxAttributionFiltersPerSource) + return absl::nullopt; + + for (const auto& [filter, values] : filter_values) { + if (filter.size() > blink::kMaxBytesPerAttributionFilterString) + return absl::nullopt; + + if (values.size() > blink::kMaxValuesPerAttributionFilter) + return absl::nullopt; + + for (const auto& value : values) { + if (value.size() > blink::kMaxBytesPerAttributionFilterString) + return absl::nullopt; + } + } + + return AttributionFilterData(std::move(filter_values)); +} + +AttributionFilterData::AttributionFilterData() = default; + +AttributionFilterData::AttributionFilterData(FilterValues filter_values) + : filter_values_(std::move(filter_values)) {} + +AttributionFilterData::~AttributionFilterData() = default; + +AttributionFilterData::AttributionFilterData(const AttributionFilterData&) = + default; + +AttributionFilterData::AttributionFilterData(AttributionFilterData&&) = default; + +AttributionFilterData& AttributionFilterData::operator=( + const AttributionFilterData&) = default; + +AttributionFilterData& AttributionFilterData::operator=( + AttributionFilterData&&) = default; + +std::string AttributionFilterData::Serialize() const { + proto::AttributionFilterData msg; + + for (const auto& [filter, values] : filter_values_) { + proto::AttributionFilterValues filter_values_msg; + filter_values_msg.mutable_values()->Reserve(values.size()); + for (std::string value : values) { + filter_values_msg.mutable_values()->Add(std::move(value)); + } + (*msg.mutable_filter_values())[filter] = std::move(filter_values_msg); + } + + std::string string; + bool success = msg.SerializeToString(&string); + DCHECK(success); + return string; +} + +} // namespace content
diff --git a/content/browser/attribution_reporting/attribution_filter_data.h b/content/browser/attribution_reporting/attribution_filter_data.h new file mode 100644 index 0000000..9f7a77c --- /dev/null +++ b/content/browser/attribution_reporting/attribution_filter_data.h
@@ -0,0 +1,48 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_FILTER_DATA_H_ +#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_FILTER_DATA_H_ + +#include <string> +#include <vector> + +#include "base/containers/flat_map.h" +#include "content/common/content_export.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace content { + +// Supports persistence to disk via serializaton to/from proto. +class CONTENT_EXPORT AttributionFilterData { + public: + using FilterValues = base::flat_map<std::string, std::vector<std::string>>; + + static absl::optional<AttributionFilterData> Deserialize(const std::string&); + + static absl::optional<AttributionFilterData> FromFilterValues(FilterValues&&); + + AttributionFilterData(); + + ~AttributionFilterData(); + + AttributionFilterData(const AttributionFilterData&); + AttributionFilterData(AttributionFilterData&&); + + AttributionFilterData& operator=(const AttributionFilterData&); + AttributionFilterData& operator=(AttributionFilterData&&); + + const FilterValues& filter_values() const { return filter_values_; } + + std::string Serialize() const; + + private: + explicit AttributionFilterData(FilterValues filter_values); + + FilterValues filter_values_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_FILTER_DATA_H_
diff --git a/content/browser/attribution_reporting/attribution_host_utils.cc b/content/browser/attribution_reporting/attribution_host_utils.cc index d98723b..456ae382 100644 --- a/content/browser/attribution_reporting/attribution_host_utils.cc +++ b/content/browser/attribution_reporting/attribution_host_utils.cc
@@ -5,10 +5,12 @@ #include "content/browser/attribution_reporting/attribution_host_utils.h" #include <memory> +#include <utility> #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/common_source_info.h" #include "content/browser/attribution_reporting/storable_source.h" @@ -64,8 +66,8 @@ impression.conversion_destination, reporting_origin, impression_time, CommonSourceInfo::GetExpiryTime(impression.expiry, impression_time, source_type), - source_type, impression.priority, /*debug_key=*/absl::nullopt, - AttributionAggregatableSources())); + source_type, impression.priority, AttributionFilterData(), + /*debug_key=*/absl::nullopt, AttributionAggregatableSources())); // TODO(apaseltiner): It would be nice to be able to report an issue in // DevTools in the event that a debug key is present but the corresponding
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc index 065e220..6796e0c 100644 --- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -471,7 +471,7 @@ if (table.children.length === 11 && table.children[0].children[2].innerText === "https://conversion.test" && table.children[0].children[3].innerText === - "https://report.test/.well-known/attribution-reporting/report-attribution" && + "https://report.test/.well-known/attribution-reporting/report-event-attribution" && table.children[0].children[6].innerText === "13" && table.children[0].children[7].innerText === "yes" && table.children[0].children[8].innerText === "Pending" && @@ -507,7 +507,7 @@ if (table.children.length === 11 && table.children[10].children[2].innerText === "https://conversion.test" && table.children[10].children[3].innerText === - "https://report.test/.well-known/attribution-reporting/report-attribution" && + "https://report.test/.well-known/attribution-reporting/report-event-attribution" && table.children[10].children[6].innerText === "13" && table.children[10].children[7].innerText === "yes" && table.children[10].children[8].innerText === "Pending" && @@ -545,7 +545,7 @@ if (table.children.length === 11 && table.children[0].children[2].innerText === "https://conversion.test" && table.children[0].children[3].innerText === - "https://report.test/.well-known/attribution-reporting/report-attribution" && + "https://report.test/.well-known/attribution-reporting/report-event-attribution" && table.children[0].children[6].innerText === "13" && table.children[0].children[7].innerText === "yes" && table.children[0].children[8].innerText === "Pending" &&
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc index eb89850..0c7644b 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -410,11 +410,14 @@ TEST_F(AttributionManagerImplTest, MultipleReportsWithSameReportTime_AllSentSimultaneously) { const GURL url_a( - "https://a.example/.well-known/attribution-reporting/report-attribution"); + "https://a.example/.well-known/attribution-reporting/" + "report-event-attribution"); const GURL url_b( - "https://b.example/.well-known/attribution-reporting/report-attribution"); + "https://b.example/.well-known/attribution-reporting/" + "report-event-attribution"); const GURL url_c( - "https://c.example/.well-known/attribution-reporting/report-attribution"); + "https://c.example/.well-known/attribution-reporting/" + "report-event-attribution"); const auto origin_a = url::Origin::Create(url_a); const auto origin_b = url::Origin::Create(url_b); @@ -460,9 +463,11 @@ TEST_F(AttributionManagerImplTest, MultipleReportsWithDifferentReportTimes_SentInSequence) { const GURL url_a( - "https://a.example/.well-known/attribution-reporting/report-attribution"); + "https://a.example/.well-known/attribution-reporting/" + "report-event-attribution"); const GURL url_b( - "https://b.example/.well-known/attribution-reporting/report-attribution"); + "https://b.example/.well-known/attribution-reporting/" + "report-event-attribution"); const auto origin_a = url::Origin::Create(url_a); const auto origin_b = url::Origin::Create(url_b); @@ -540,9 +545,11 @@ TEST_F(AttributionManagerImplTest, RetryLogicOverridesGetReportTimer) { const GURL url_a( - "https://a.example/.well-known/attribution-reporting/report-attribution"); + "https://a.example/.well-known/attribution-reporting/" + "report-event-attribution"); const GURL url_b( - "https://b.example/.well-known/attribution-reporting/report-attribution"); + "https://b.example/.well-known/attribution-reporting/" + "report-event-attribution"); const auto origin_a = url::Origin::Create(url_a); const auto origin_b = url::Origin::Create(url_b);
diff --git a/content/browser/attribution_reporting/attribution_report.cc b/content/browser/attribution_reporting/attribution_report.cc index e18449b..6cf51e8 100644 --- a/content/browser/attribution_reporting/attribution_report.cc +++ b/content/browser/attribution_reporting/attribution_report.cc
@@ -100,7 +100,7 @@ struct Visitor { const char* operator()(const EventLevelData&) { static constexpr char kEventEndpointPath[] = - "/.well-known/attribution-reporting/report-attribution"; + "/.well-known/attribution-reporting/report-event-attribution"; return kEventEndpointPath; }
diff --git a/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc b/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc index 9185c00..b5ac6616 100644 --- a/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc +++ b/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc
@@ -46,7 +46,8 @@ using Checkpoint = ::testing::MockFunction<void(int)>; const char kReportUrl[] = - "https://report.test/.well-known/attribution-reporting/report-attribution"; + "https://report.test/.well-known/attribution-reporting/" + "report-event-attribution"; AttributionReport DefaultReport() { return ReportBuilder( @@ -246,7 +247,8 @@ const network::ResourceRequest* pending_request; EXPECT_TRUE(test_url_loader_factory_.IsPending( - "https://a.com/.well-known/attribution-reporting/report-attribution", + "https://a.com/.well-known/attribution-reporting/" + "report-event-attribution", &pending_request)); // Ensure that the request is sent with no credentials.
diff --git a/content/browser/attribution_reporting/attribution_reporting.proto b/content/browser/attribution_reporting/attribution_reporting.proto index b5ff336..1a74fd5 100644 --- a/content/browser/attribution_reporting/attribution_reporting.proto +++ b/content/browser/attribution_reporting/attribution_reporting.proto
@@ -18,3 +18,12 @@ message AttributionAggregatableSources { map<string, AttributionAggregatableKey> sources = 1; } + +message AttributionFilterValues { + repeated string values = 1; +} + +// Proto equivalent of `blink::mojom::AttributionData`. +message AttributionFilterData { + map<string, AttributionFilterValues> filter_values = 1; +}
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index f3c00e5..549182a 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -26,6 +26,7 @@ #include "base/time/time.h" #include "content/browser/attribution_reporting/aggregatable_attribution.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_info.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" @@ -51,18 +52,18 @@ namespace content { // Version number of the database. -const int AttributionStorageSql::kCurrentVersionNumber = 27; +const int AttributionStorageSql::kCurrentVersionNumber = 28; // Earliest version which can use a |kCurrentVersionNumber| database // without failing. -const int AttributionStorageSql::kCompatibleVersionNumber = 27; +const int AttributionStorageSql::kCompatibleVersionNumber = 28; // Latest version of the database that cannot be upgraded to // |kCurrentVersionNumber| without razing the database. // // Note that all versions >=15 were introduced during the transitional state of // the Attribution Reporting API and can be removed when done. -const int AttributionStorageSql::kDeprecatedVersionNumber = 26; +const int AttributionStorageSql::kDeprecatedVersionNumber = 27; namespace { @@ -182,7 +183,7 @@ // expected ordering of columns used for the input to this function. absl::optional<StoredSourceData> ReadSourceFromStatement( sql::Statement& statement) { - DCHECK_EQ(statement.ColumnCount(), 14); + DCHECK_EQ(statement.ColumnCount(), 15); StoredSource::Id source_id(statement.ColumnInt64(0)); uint64_t source_event_id = DeserializeUint64(statement.ColumnInt64(1)); @@ -201,10 +202,12 @@ int64_t aggregatable_budget_consumed = statement.ColumnInt64(12); absl::optional<AttributionAggregatableSources> aggregatable_sources = ParseAggregatableSources(statement.ColumnString(13)); + absl::optional<AttributionFilterData> filter_data = + AttributionFilterData::Deserialize(statement.ColumnString(14)); if (!source_type.has_value() || !attribution_logic.has_value() || num_conversions < 0 || aggregatable_budget_consumed < 0 || - !aggregatable_sources.has_value()) { + !aggregatable_sources.has_value() || !filter_data.has_value()) { return absl::nullopt; } @@ -213,7 +216,8 @@ CommonSourceInfo(source_event_id, std::move(impression_origin), std::move(conversion_origin), std::move(reporting_origin), impression_time, - expiry_time, *source_type, priority, debug_key, + expiry_time, *source_type, priority, + std::move(*filter_data), debug_key, std::move(*aggregatable_sources)), *attribution_logic, source_id), .num_conversions = num_conversions, @@ -227,7 +231,8 @@ "SELECT impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time,expiry_time," "source_type,attributed_truthfully,priority,debug_key," - "num_conversions,aggregatable_budget_consumed,aggregatable_sources " + "num_conversions,aggregatable_budget_consumed,aggregatable_sources," + "filter_data " "FROM impressions " "WHERE impression_id = ?"; sql::Statement statement( @@ -293,7 +298,8 @@ "SELECT impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time,expiry_time," "source_type,attributed_truthfully,priority,debug_key," - "num_conversions,aggregatable_budget_consumed,aggregatable_sources " + "num_conversions,aggregatable_budget_consumed,aggregatable_sources," + "filter_data " "FROM impressions " DCHECK_SQL_INDEXED_BY("conversion_destination_idx") "WHERE conversion_destination = ? AND reporting_origin = ? AND " @@ -439,8 +445,8 @@ "reporting_origin,impression_time,expiry_time,source_type," "attributed_truthfully,priority,impression_site," "num_conversions,active,debug_key,aggregatable_budget_consumed," - "aggregatable_sources)" - "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?)"; + "aggregatable_sources,filter_data)" + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?)"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kInsertImpressionSql)); statement.BindInt64(0, SerializeUint64(common_info.source_event_id())); @@ -461,6 +467,7 @@ statement.BindBlob( 14, common_info.aggregatable_sources().proto().SerializeAsString()); + statement.BindBlob(15, common_info.filter_data().Serialize()); if (!statement.Run()) return StoreSourceResult(StorableSource::Result::kInternalError); @@ -910,7 +917,7 @@ // ordering of columns used for the input to this function. absl::optional<AttributionReport> AttributionStorageSql::ReadReportFromStatement(sql::Statement& statement) { - DCHECK_EQ(statement.ColumnCount(), 20); + DCHECK_EQ(statement.ColumnCount(), 21); uint64_t trigger_data = DeserializeUint64(statement.ColumnInt64(0)); base::Time trigger_time = statement.ColumnTime(1); @@ -937,6 +944,8 @@ ColumnUint64OrNull(statement, 18); absl::optional<AttributionAggregatableSources> aggregatable_sources = ParseAggregatableSources(statement.ColumnString(19)); + absl::optional<AttributionFilterData> source_filter_data = + AttributionFilterData::Deserialize(statement.ColumnString(20)); // Ensure origins are valid before continuing. This could happen if there is // database corruption. @@ -947,7 +956,8 @@ if (impression_origin.opaque() || conversion_origin.opaque() || reporting_origin.opaque() || !source_type.has_value() || !attribution_logic.has_value() || failed_send_attempts < 0 || - !external_report_id.is_valid() || !aggregatable_sources.has_value()) { + !external_report_id.is_valid() || !aggregatable_sources.has_value() || + !source_filter_data.has_value()) { return absl::nullopt; } @@ -958,7 +968,8 @@ std::move(conversion_origin), std::move(reporting_origin), impression_time, expiry_time, *source_type, attribution_source_priority, - source_debug_key, std::move(*aggregatable_sources)), + std::move(*source_filter_data), source_debug_key, + std::move(*aggregatable_sources)), *attribution_logic, source_id); AttributionReport report( @@ -1020,7 +1031,7 @@ "I.impression_origin,I.conversion_origin,I.reporting_origin," "I.impression_data,I.impression_time,I.expiry_time,I.impression_id," "I.source_type,I.priority,I.attributed_truthfully,I.debug_key," - "C.debug_key,I.aggregatable_sources " + "C.debug_key,I.aggregatable_sources,I.filter_data " "FROM conversions C JOIN impressions I ON " "C.impression_id = I.impression_id WHERE C.report_time <= ? " "LIMIT ?"; @@ -1103,7 +1114,7 @@ "I.impression_origin,I.conversion_origin,I.reporting_origin," "I.impression_data,I.impression_time,I.expiry_time,I.impression_id," "I.source_type,I.priority,I.attributed_truthfully,I.debug_key," - "C.debug_key,I.aggregatable_sources " + "C.debug_key,I.aggregatable_sources,I.filter_data " "FROM conversions C JOIN impressions I ON " "C.impression_id = I.impression_id WHERE C.conversion_id = ?"; sql::Statement statement( @@ -1563,7 +1574,8 @@ "SELECT impression_id,impression_data,impression_origin," "conversion_origin,reporting_origin,impression_time,expiry_time," "source_type,attributed_truthfully,priority,debug_key," - "num_conversions,aggregatable_budget_consumed,aggregatable_sources " + "num_conversions,aggregatable_budget_consumed,aggregatable_sources," + "filter_data " "FROM impressions " "WHERE active = 1 and expiry_time > ? " "LIMIT ?"; @@ -1749,6 +1761,8 @@ // |StoredSource::AttributionLogic| enum. // |impression_site| is used to optimize the lookup of sources; // |CommonSourceInfo::ImpressionSite| is always derived from the origin. + // |filter_data| is a serialized `AttributionFilterData` used for source + // matching. // // |impression_id| uses AUTOINCREMENT to ensure that IDs aren't reused over // the lifetime of the DB. @@ -1770,7 +1784,8 @@ "impression_site TEXT NOT NULL," "debug_key INTEGER," "aggregatable_budget_consumed INTEGER NOT NULL," - "aggregatable_sources BLOB NOT NULL)"; + "aggregatable_sources BLOB NOT NULL," + "filter_data BLOB NOT NULL)"; if (!db_->Execute(kImpressionTableSql)) return false; @@ -2277,7 +2292,7 @@ "A.trigger_time,I.impression_origin,I.conversion_origin," "I.reporting_origin,I.impression_data,I.impression_time,I.expiry_time," "I.impression_id,I.source_type,I.priority,I.attributed_truthfully," - "I.debug_key,A.debug_key,I.aggregatable_sources " + "I.debug_key,A.debug_key,I.aggregatable_sources,I.filter_data " "FROM aggregatable_contributions AS C " DCHECK_SQL_INDEXED_BY("contribution_report_time_idx") "JOIN aggregatable_report_metadata AS A " @@ -2325,6 +2340,8 @@ ColumnUint64OrNull(statement, 19); absl::optional<AttributionAggregatableSources> aggregatable_sources = ParseAggregatableSources(statement.ColumnString(20)); + absl::optional<AttributionFilterData> filter_data = + AttributionFilterData::Deserialize(statement.ColumnString(21)); // Ensure origins are valid before continuing. This could happen if there is // database corruption. @@ -2332,7 +2349,8 @@ !external_report_id.is_valid() || impression_origin.opaque() || conversion_origin.opaque() || reporting_origin.opaque() || !source_type.has_value() || !attribution_logic.has_value() || - failed_send_attempts < 0 || !aggregatable_sources.has_value()) { + failed_send_attempts < 0 || !aggregatable_sources.has_value() || + !filter_data.has_value()) { continue; } @@ -2343,7 +2361,8 @@ std::move(conversion_origin), std::move(reporting_origin), impression_time, expiry_time, *source_type, attribution_source_priority, - source_debug_key, std::move(*aggregatable_sources)), + std::move(*filter_data), source_debug_key, + std::move(*aggregatable_sources)), *attribution_logic, source_id); AttributionReport report(
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc index fda10ea1..d24cf14 100644 --- a/content/browser/attribution_reporting/attribution_storage_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -25,6 +25,7 @@ #include "build/build_config.h" #include "content/browser/attribution_reporting/aggregatable_attribution.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_observer_types.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_reporting.pb.h" @@ -2153,4 +2154,19 @@ EventLevelDataIs(TriggerDataIs(1))))); } +TEST_F(AttributionStorageTest, SourceFilterData_RoundTrips) { + storage()->StoreSource( + SourceBuilder().SetFilterData(AttributionFilterData()).Build()); + + auto filter_data = + AttributionFilterData::FromFilterValues({{"abc", {"x", "y"}}}); + ASSERT_TRUE(filter_data.has_value()); + + storage()->StoreSource(SourceBuilder().SetFilterData(*filter_data).Build()); + + EXPECT_THAT(storage()->GetActiveSources(), + ElementsAre(SourceFilterDataIs(AttributionFilterData()), + SourceFilterDataIs(*filter_data))); +} + } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index c8a96fb4..1a427d7 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -425,6 +425,11 @@ return *this; } +SourceBuilder& SourceBuilder::SetFilterData(AttributionFilterData filter_data) { + filter_data_ = std::move(filter_data); + return *this; +} + SourceBuilder& SourceBuilder::SetDebugKey(absl::optional<uint64_t> debug_key) { debug_key_ = debug_key; return *this; @@ -457,7 +462,7 @@ source_event_id_, impression_origin_, conversion_origin_, reporting_origin_, impression_time_, /*expiry_time=*/impression_time_ + expiry_, source_type_, priority_, - debug_key_, aggregatable_sources_); + filter_data_, debug_key_, aggregatable_sources_); } StorableSource SourceBuilder::Build() const { @@ -654,13 +659,19 @@ return tie(a) == tie(b); } +bool operator==(const AttributionFilterData& a, + const AttributionFilterData& b) { + return a.filter_values() == b.filter_values(); +} + bool operator==(const CommonSourceInfo& a, const CommonSourceInfo& b) { const auto tie = [](const CommonSourceInfo& source) { - return std::make_tuple( - source.source_event_id(), source.impression_origin(), - source.conversion_origin(), source.reporting_origin(), - source.impression_time(), source.expiry_time(), source.source_type(), - source.priority(), source.debug_key(), source.aggregatable_sources()); + return std::make_tuple(source.source_event_id(), source.impression_origin(), + source.conversion_origin(), + source.reporting_origin(), source.impression_time(), + source.expiry_time(), source.source_type(), + source.priority(), source.filter_data(), + source.debug_key(), source.aggregatable_sources()); }; return tie(a) == tie(b); } @@ -890,6 +901,27 @@ << "}"; } +std::ostream& operator<<(std::ostream& out, + const AttributionFilterData& filter_data) { + out << "{"; + + const char* outer_separator = ""; + for (const auto& [filter, values] : filter_data.filter_values()) { + out << outer_separator << filter << "=["; + + const char* inner_separator = ""; + for (const auto& value : values) { + out << inner_separator << value; + inner_separator = ", "; + } + + out << "]"; + outer_separator = ", "; + } + + return out << "}"; +} + std::ostream& operator<<(std::ostream& out, const CommonSourceInfo& source) { return out << "{source_event_id=" << source.source_event_id() << ",impression_origin=" << source.impression_origin() @@ -898,7 +930,8 @@ << ",impression_time=" << source.impression_time() << ",expiry_time=" << source.expiry_time() << ",source_type=" << source.source_type() - << ",priority=" << source.priority() << ",debug_key=" + << ",priority=" << source.priority() + << ",filter_data=" << source.filter_data() << ",debug_key=" << (source.debug_key() ? base::NumberToString(*source.debug_key()) : "null") << ",aggregatable_sources=" << source.aggregatable_sources()
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index f484793..6696a22 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -23,6 +23,7 @@ #include "content/browser/attribution_reporting/aggregatable_attribution.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" #include "content/browser/attribution_reporting/attribution_data_host_manager.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_host.h" #include "content/browser/attribution_reporting/attribution_info.h" #include "content/browser/attribution_reporting/attribution_manager.h" @@ -352,6 +353,8 @@ SourceBuilder& SetAttributionLogic( StoredSource::AttributionLogic attribution_logic); + SourceBuilder& SetFilterData(AttributionFilterData filter_data); + SourceBuilder& SetDebugKey(absl::optional<uint64_t> debug_key); SourceBuilder& SetSourceId(StoredSource::Id source_id); @@ -379,6 +382,7 @@ int64_t priority_ = 0; StoredSource::AttributionLogic attribution_logic_ = StoredSource::AttributionLogic::kTruthfully; + AttributionFilterData filter_data_; absl::optional<uint64_t> debug_key_; // `base::StrongAlias` does not automatically initialize the value here. // Ensure that we don't use uninitialized memory. @@ -528,6 +532,8 @@ bool operator==(const AttributionTrigger& a, const AttributionTrigger& b); +bool operator==(const AttributionFilterData& a, const AttributionFilterData& b); + bool operator==(const CommonSourceInfo& a, const CommonSourceInfo& b); bool operator==(const AttributionInfo& a, const AttributionInfo& b); @@ -574,6 +580,9 @@ std::ostream& operator<<(std::ostream& out, const AttributionTrigger& conversion); +std::ostream& operator<<(std::ostream& out, + const AttributionFilterData& filter_data); + std::ostream& operator<<(std::ostream& out, const CommonSourceInfo& source); std::ostream& operator<<(std::ostream& out, @@ -671,6 +680,11 @@ result_listener); } +MATCHER_P(SourceFilterDataIs, matcher, "") { + return ExplainMatchResult(matcher, arg.common_info().filter_data(), + result_listener); +} + MATCHER_P(DedupKeysAre, matcher, "") { return ExplainMatchResult(matcher, arg.dedup_keys(), result_listener); }
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index 13e4fda..e675502 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -188,7 +188,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -228,7 +228,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*body=*/base::Value(), https_server()); ASSERT_TRUE(https_server()->Start()); @@ -265,7 +265,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -302,7 +302,7 @@ ImpressionFromCrossOriginSubframe_ReportSent) { ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -350,7 +350,7 @@ ImpressionOnNoOpenerNavigation_ReportSent) { ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -390,7 +390,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -434,7 +434,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -484,7 +484,7 @@ MultipleImpressionsPerConversion_ReportSentWithAttribution) { ExpectedReportWaiter expected_report( GURL("https://d.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"2", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -543,7 +543,7 @@ // Report will be sent for the impression with highest priority. ExpectedReportWaiter expected_report( GURL("https://d.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); @@ -606,7 +606,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*body=*/base::Value(), https_server()); ASSERT_TRUE(https_server()->Start()); @@ -654,7 +654,7 @@ // the report's `trigger_data`. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); @@ -694,7 +694,7 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"5", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); @@ -737,13 +737,13 @@ // the report's `trigger_data`. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); ExpectedReportWaiter expected_report_not_sent( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*body=*/base::Value(), https_server()); ASSERT_TRUE(https_server()->Start()); @@ -795,7 +795,7 @@ // the report's `trigger_data`. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); @@ -832,14 +832,14 @@ // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report1( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"7", https_server()); // 12 below is sanitized to 4 here by `SanitizeTriggerData()`. ExpectedReportWaiter expected_report2( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"1", /*source_type=*/"navigation", /*trigger_data=*/"4", https_server()); @@ -907,7 +907,7 @@ NoImpressionRegisteredOnPrerender) { ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); @@ -967,7 +967,7 @@ ImpressionRegisteredOnActivatedPrerender) { ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); @@ -1027,7 +1027,7 @@ NoConversionsOnPrerender) { ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server()); @@ -1088,7 +1088,7 @@ ConversionsRegisteredOnActivatedPrerender) { ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/" - "report-attribution"), + "report-event-attribution"), /*attribution_destination=*/"https://b.test", /*source_event_id=*/"7", /*source_type=*/"event", /*trigger_data=*/"1", https_server());
diff --git a/content/browser/attribution_reporting/common_source_info.cc b/content/browser/attribution_reporting/common_source_info.cc index 49c185f..0074e2e9 100644 --- a/content/browser/attribution_reporting/common_source_info.cc +++ b/content/browser/attribution_reporting/common_source_info.cc
@@ -4,6 +4,8 @@ #include "content/browser/attribution_reporting/common_source_info.h" +#include <utility> + #include "base/check_op.h" #include "base/cxx17_backports.h" #include "net/base/schemeful_site.h" @@ -39,6 +41,7 @@ base::Time expiry_time, SourceType source_type, int64_t priority, + AttributionFilterData filter_data, absl::optional<uint64_t> debug_key, AttributionAggregatableSources aggregatable_sources) : source_event_id_(source_event_id), @@ -49,6 +52,7 @@ expiry_time_(expiry_time), source_type_(source_type), priority_(priority), + filter_data_(std::move(filter_data)), debug_key_(debug_key), aggregatable_sources_(std::move(aggregatable_sources)) { // 30 days is the max allowed expiry for an impression.
diff --git a/content/browser/attribution_reporting/common_source_info.h b/content/browser/attribution_reporting/common_source_info.h index 10a68485..7cc28b3 100644 --- a/content/browser/attribution_reporting/common_source_info.h +++ b/content/browser/attribution_reporting/common_source_info.h
@@ -9,6 +9,7 @@ #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/common/content_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/origin.h" @@ -48,6 +49,7 @@ base::Time expiry_time, SourceType source_type, int64_t priority, + AttributionFilterData filter_data, absl::optional<uint64_t> debug_key, AttributionAggregatableSources aggregatable_sources); @@ -75,6 +77,8 @@ int64_t priority() const { return priority_; } + const AttributionFilterData& filter_data() const { return filter_data_; } + absl::optional<uint64_t> debug_key() const { return debug_key_; } const AttributionAggregatableSources& aggregatable_sources() const { @@ -104,6 +108,7 @@ base::Time expiry_time_; SourceType source_type_; int64_t priority_; + AttributionFilterData filter_data_; absl::optional<uint64_t> debug_key_; AttributionAggregatableSources aggregatable_sources_;
diff --git a/content/browser/file_system_access/file_system_access_access_handle_host_impl.cc b/content/browser/file_system_access/file_system_access_access_handle_host_impl.cc index 5de6c25..870a942 100644 --- a/content/browser/file_system_access/file_system_access_access_handle_host_impl.cc +++ b/content/browser/file_system_access/file_system_access_access_handle_host_impl.cc
@@ -4,6 +4,7 @@ #include "content/browser/file_system_access/file_system_access_access_handle_host_impl.h" +#include "base/callback_helpers.h" #include "content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.h" #include "content/browser/file_system_access/file_system_access_file_delegate_host_impl.h" #include "storage/browser/file_system/file_system_context.h" @@ -63,10 +64,14 @@ void FileSystemAccessAccessHandleHostImpl::Close(CloseCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!close_callback_); - // `receiver_` is not reset, since `callback` is yet to be called. + // Run `callback` when this instance is destroyed, after capacity allocation + // has been released. + close_callback_ = base::ScopedClosureRunner(std::move(callback)); + // Removes `this`. - manager_->RemoveAccessHandleHost(this, std::move(callback)); + manager_->RemoveAccessHandleHost(this); } void FileSystemAccessAccessHandleHostImpl::OnDisconnect() { @@ -74,7 +79,7 @@ // No need to reset `receiver_` after it disconnected. // Removes `this`. - manager_->RemoveAccessHandleHost(this, base::DoNothing()); + manager_->RemoveAccessHandleHost(this); } } // namespace content
diff --git a/content/browser/file_system_access/file_system_access_access_handle_host_impl.h b/content/browser/file_system_access/file_system_access_access_handle_host_impl.h index 4d1ab34..0d20a774 100644 --- a/content/browser/file_system_access/file_system_access_access_handle_host_impl.h +++ b/content/browser/file_system_access/file_system_access_access_handle_host_impl.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.h" #include "content/browser/file_system_access/file_system_access_file_delegate_host_impl.h" @@ -94,6 +95,13 @@ const storage::FileSystemURL url_; + // FileSystemAccessFileHandleHost::CloseCallback which is set when Close() is + // called on an Access Handle. The Close() call will eventually destroy + // `this`, allowing `close_callback_` to be run in the destructor, after the + // file has been closed and the capacity allocation has been cleaned up but + // before `receiver_` is destroyed (which the callback replies via). + base::ScopedClosureRunner close_callback_; + // Comes from `FileSystemOperation::OpenFileCallback`'s `on_close_callback`, // which needs to run when its corresponding file closes. `on_close_callback_` // will run when `this` is destroyed, which errs on the side of not running
diff --git a/content/browser/file_system_access/file_system_access_manager_impl.cc b/content/browser/file_system_access/file_system_access_manager_impl.cc index 93b2e46..ab39332e 100644 --- a/content/browser/file_system_access/file_system_access_manager_impl.cc +++ b/content/browser/file_system_access/file_system_access_manager_impl.cc
@@ -8,6 +8,7 @@ #include <string> #include "base/bind.h" +#include "base/callback_forward.h" #include "base/callback_helpers.h" #include "base/check_op.h" #include "base/command_line.h" @@ -1334,22 +1335,20 @@ } void FileSystemAccessManagerImpl::RemoveAccessHandleHost( - FileSystemAccessAccessHandleHostImpl* access_handle_host, - base::OnceCallback<void()> callback) { + FileSystemAccessAccessHandleHostImpl* access_handle_host) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(access_handle_host); // Capacity allocations only exist in non-incognito mode. if (context()->is_incognito()) { - DidCleanupAccessHandleCapacityAllocation(access_handle_host, - std::move(callback)); + DidCleanupAccessHandleCapacityAllocation(access_handle_host); return; } CleanupAccessHandleCapacityAllocation( access_handle_host->url(), access_handle_host->granted_capacity(), base::BindOnce(&FileSystemAccessManagerImpl:: DidCleanupAccessHandleCapacityAllocation, - weak_factory_.GetWeakPtr(), access_handle_host, - std::move(callback))); + weak_factory_.GetWeakPtr(), access_handle_host)); } void FileSystemAccessManagerImpl::RemoveToken( @@ -1432,7 +1431,7 @@ void FileSystemAccessManagerImpl::CleanupAccessHandleCapacityAllocation( const storage::FileSystemURL& url, int64_t allocated_file_size, - base::OnceCallback<void()> callback) { + base::OnceClosure callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_GE(allocated_file_size, 0); @@ -1448,7 +1447,7 @@ void FileSystemAccessManagerImpl::CleanupAccessHandleCapacityAllocationImpl( const storage::FileSystemURL& url, int64_t allocated_file_size, - base::OnceCallback<void()> callback, + base::OnceClosure callback, base::File::Error result, const base::File::Info& file_info) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -1473,11 +1472,10 @@ } void FileSystemAccessManagerImpl::DidCleanupAccessHandleCapacityAllocation( - FileSystemAccessAccessHandleHostImpl* access_handle_host, - base::OnceCallback<void()> callback) { + FileSystemAccessAccessHandleHostImpl* access_handle_host) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(access_handle_host); - std::move(callback).Run(); + size_t count_removed = access_handle_host_receivers_.erase(access_handle_host); DCHECK_EQ(1u, count_removed);
diff --git a/content/browser/file_system_access/file_system_access_manager_impl.h b/content/browser/file_system_access/file_system_access_manager_impl.h index 4115394..522d9c4 100644 --- a/content/browser/file_system_access/file_system_access_manager_impl.h +++ b/content/browser/file_system_access/file_system_access_manager_impl.h
@@ -5,6 +5,7 @@ #ifndef CONTENT_BROWSER_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_MANAGER_IMPL_H_ #define CONTENT_BROWSER_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_MANAGER_IMPL_H_ +#include "base/callback_forward.h" #include "base/containers/flat_set.h" #include "base/containers/unique_ptr_adapters.h" #include "base/files/file_path.h" @@ -269,8 +270,7 @@ // Remove `access_handle_host` from `access_handle_host_receivers_`. It is an // error to try to remove an access handle that doesn't exist. void RemoveAccessHandleHost( - FileSystemAccessAccessHandleHostImpl* access_handle_host, - base::OnceCallback<void()> callback); + FileSystemAccessAccessHandleHostImpl* access_handle_host); // Remove `token` from `transfer_tokens_`. It is an error to try to remove // a token that doesn't exist. @@ -442,25 +442,23 @@ // FileSystemAccessCapacityAllocationHosts may reserve too much capacity from // the quota system. This function determines the file's actual size and // corrects its capacity usage in the quota system. - void CleanupAccessHandleCapacityAllocation( - const storage::FileSystemURL& url, - int64_t allocated_file_size, - base::OnceCallback<void()> callback); + void CleanupAccessHandleCapacityAllocation(const storage::FileSystemURL& url, + int64_t allocated_file_size, + base::OnceClosure callback); // Performs the actual work of `CleanupAccessHandleCapacityAllocation()` after // the file's size has been determined. void CleanupAccessHandleCapacityAllocationImpl( const storage::FileSystemURL& url, int64_t allocated_file_size, - base::OnceCallback<void()> callback, + base::OnceClosure callback, base::File::Error result, const base::File::Info& file_info); // Called after `CleanupAccessHandleCapacityAllocationImpl()` has completed. // Removes `access_handle_host` from the set of active hosts. void DidCleanupAccessHandleCapacityAllocation( - FileSystemAccessAccessHandleHostImpl* access_handle_host, - base::OnceCallback<void()> callback); + FileSystemAccessAccessHandleHostImpl* access_handle_host); // Calls `token_resolved_callback` with a FileSystemAccessEntry object // that's at the file path of the FileSystemAccessDataTransferToken with token
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index 19fb873c3..0cdc7b0 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -97,7 +97,11 @@ "groupName": interestGroupName, "renderUrl": "data for " + renderUrl, "seller": seller}, - bid: bid, render: renderUrl}; + bid: bid, + render: renderUrl, + // Only need to allow component auction participation when + // `topLevelSeller` is populated. + allowComponentAuction: "topLevelSeller" in browserSignals}; if (interestGroup.adComponents) { result.adComponents = [interestGroup.adComponents[0].renderUrl]; result.ad.adComponentsUrl = interestGroup.adComponents[0].renderUrl; @@ -2020,7 +2024,9 @@ ASSERT_TRUE(hit_breakpoints); base::Value::ConstListView hit_breakpoints_list = hit_breakpoints->GetListDeprecated(); - ASSERT_EQ(1u, hit_breakpoints_list.size()); + // This is LE and not EQ to work around + // https://bugs.chromium.org/p/v8/issues/detail?id=12586 + ASSERT_LE(1u, hit_breakpoints_list.size()); ASSERT_TRUE(hit_breakpoints_list[0].is_string()); EXPECT_EQ(base::StringPrintf("1:7:0:%s", debug_url.spec().c_str()), hit_breakpoints_list[0].GetString()); @@ -2295,11 +2301,16 @@ const char kBidScript[] = R"( function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { - if (browserSignals.seller == "https://component.seller1.test") - return {ad: [], bid: 1, render: "https://component-bid.test/"}; - if (browserSignals.seller == "https://component.seller2.test") - return {ad: [], bid: 3, render: "https://component-bid.test/"}; - return {ad: [], bid: 2, render: "https://top-level-bid.test/"}; + if (browserSignals.seller == "https://component.seller1.test") { + return {ad: [], bid: 1, render: "https://component-bid.test/", + allowComponentAuction: true}; + } + if (browserSignals.seller == "https://component.seller2.test") { + return {ad: [], bid: 3, render: "https://component-bid.test/", + allowComponentAuction: true}; + } + return {ad: [], bid: 2, render: "https://top-level-bid.test/", + allowComponentAuction: false}; } function reportWin(auctionSignals, perBuyerSignals, sellerSignals,
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 12d7573..2d90343 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -3476,6 +3476,71 @@ "a.test", "/interest_group/decision_logic.js")))); } +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, ComponentAuction) { + GURL test_url = https_server_->GetURL("a.test", "/page_with_iframe.html"); + ASSERT_TRUE(NavigateToURL(shell(), test_url)); + url::Origin test_origin = url::Origin::Create(test_url); + GURL ad_url = https_server_->GetURL("c.test", "/echo?render_cars"); + + EXPECT_TRUE(JoinInterestGroupAndWaitInJs( + /*owner=*/test_origin, + /*name=*/"cars", + /*bidding_url=*/ + https_server_->GetURL("a.test", "/interest_group/bidding_logic.js"), + /*ads=*/{{{ad_url, /*metadata=*/absl::nullopt}}})); + + std::string auction_config = JsReplace( + R"({ + seller: $1, + decisionLogicUrl: $2, + componentAuctions: [{ + seller: $1, + decisionLogicUrl: $2, + interestGroupBuyers: [$1], + // Signal to the bidder to allow participation in a component + // auction. + auctionSignals: "bidderAllowsComponentAuction" + }] + })", + test_origin, + https_server_->GetURL("a.test", "/interest_group/decision_logic.js")); + RunAuctionAndWaitForURLAndNavigateIframe(auction_config, ad_url); +} + +// Test the case of a component argument in the case a bidder refuses to +// participate in component auctions. +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + ComponentAuctionBidderRefuses) { + GURL test_url = https_server_->GetURL("a.test", "/page_with_iframe.html"); + ASSERT_TRUE(NavigateToURL(shell(), test_url)); + url::Origin test_origin = url::Origin::Create(test_url); + GURL ad_url = https_server_->GetURL("c.test", "/echo?render_cars"); + + EXPECT_TRUE(JoinInterestGroupAndWaitInJs( + /*owner=*/test_origin, + /*name=*/"cars", + /*bidding_url=*/ + https_server_->GetURL("a.test", "/interest_group/bidding_logic.js"), + /*ads=*/{{{ad_url, /*metadata=*/absl::nullopt}}})); + + std::string auction_config = JsReplace( + R"({ + seller: $1, + decisionLogicUrl: $2, + componentAuctions: [{ + seller: $1, + decisionLogicUrl: $2, + interestGroupBuyers: [$1], + // Since this does not include "bidderAllowsComponentAuction", the + // bidder will refuse to participate in component auctions. + auctionSignals: "foo" + }] + })", + test_origin, + https_server_->GetURL("a.test", "/interest_group/decision_logic.js")); + EXPECT_EQ(nullptr, RunAuctionAndWait(auction_config)); +} + // Use bidder and seller worklet files that validate their arguments all have // the expected values. IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, ValidateWorkletParameters) { @@ -3571,7 +3636,7 @@ // Use different hostnames for each participant. // // Match assignments in above test as closely as possible, to make scripts - // similar, + // similar. constexpr char kBidderHost[] = "a.test"; constexpr char kTopLevelSellerHost[] = "b.test"; constexpr char kTopFrameHost[] = "c.test";
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 81a59cd..2f283ea5 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -1028,9 +1028,11 @@ // While not a true redirect, a redirect loop can be simulated by repeatedly // closing the socket and presenting a different ALPS setting with each new // handshake. - if (redirect_limit_-- == 0) { + if (--accept_ch_restart_limit_ == 0) { LogAcceptCHFrameStatus(AcceptCHFrameRestart::kRedirectOverflow); - std::move(callback).Run(net::ERR_TOO_MANY_REDIRECTS); + OnComplete(network::URLLoaderCompletionStatus( + net::ERR_TOO_MANY_ACCEPT_CH_RESTARTS)); + std::move(callback).Run(net::ERR_TOO_MANY_ACCEPT_CH_RESTARTS); return; }
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h index e109015..95dae0a 100644 --- a/content/browser/loader/navigation_url_loader_impl.h +++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -234,6 +234,7 @@ const WeakDocumentPtr initiator_document_; net::RedirectInfo redirect_info_; int redirect_limit_ = net::URLRequest::kMaxRedirects; + int accept_ch_restart_limit_ = net::URLRequest::kMaxRedirects; base::RepeatingCallback<WebContents*()> web_contents_getter_; std::unique_ptr<NavigationUIData> navigation_ui_data_;
diff --git a/content/browser/renderer_host/frame_tree_browsertest.cc b/content/browser/renderer_host/frame_tree_browsertest.cc index b41e74ba..ee26672b 100644 --- a/content/browser/renderer_host/frame_tree_browsertest.cc +++ b/content/browser/renderer_host/frame_tree_browsertest.cc
@@ -888,8 +888,8 @@ fenced_frame->WaitForDidStopLoadingForTesting(); } - void AddIframeInFencedFrame(FrameTreeNode* fenced_frame, - unsigned int child_index) { + FrameTreeNode* AddIframeInFencedFrame(FrameTreeNode* fenced_frame, + unsigned int child_index) { EXPECT_TRUE( ExecJs(fenced_frame, "var iframe_within_ff = document.createElement('iframe');" @@ -898,6 +898,7 @@ auto* iframe = fenced_frame->child_at(child_index); EXPECT_FALSE(iframe->IsFencedFrameRoot()); EXPECT_TRUE(iframe->IsInFencedFrameTree()); + return iframe; } // Navigates the element created in AddIframeInFencedFrame. @@ -2236,6 +2237,233 @@ } } +IN_PROC_BROWSER_TEST_P(FencedFrameTreeBrowserTest, FenceUserActivation) { + // This test exercises browser-side user activation in the following layout: + // A: Top-level page (origin 1) + // B: fencedframe (origin 1) + // C1: iframe (origin 1) + // D: fencedframe (origin 1) + // E1: iframe (origin 1) + // E2: iframe (origin 2) + // C2: iframe (origin 2) + // F: fencedframe (origin 1) + // G: iframe (origin 1) + // + // See the design document for more details on intended semantics: + // https://docs.google.com/document/d/1WnIhXOFycoje_sEoZR3Mo0YNSR2Ki7LABIC_HEWFaog/ + + // Chrome disallows navigation to a URL in a frame that has more than one + // ancestor with that URL, so I have to circumvent it with query params. + const GURL kOrigin1Url = + https_server()->GetURL("a.test", "/fenced_frames/empty.html"); + const GURL kOrigin1Url2 = + https_server()->GetURL("a.test", "/fenced_frames/empty.html?"); + const GURL kOrigin1Url3 = + https_server()->GetURL("a.test", "/fenced_frames/empty.html??"); + const GURL kOrigin2Url = + https_server()->GetURL("b.test", "/fenced_frames/empty.html"); + + // Navigate the top-level page. + EXPECT_TRUE(NavigateToURL(shell(), kOrigin1Url)); + // It is safe to obtain the root frame tree node here, as it doesn't change. + auto* nodeA = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetPrimaryFrameTree() + .root(); + ASSERT_NE(nullptr, nodeA); + + // Construct the children described above. + auto* nodeB = AddNestedFencedFrame(nodeA, 0); + ASSERT_NE(nullptr, nodeB); + NavigateNestedFencedFrame(nodeB, kOrigin1Url); + + auto* nodeC1 = AddIframeInFencedFrame(nodeB, 0); + ASSERT_NE(nullptr, nodeC1); + NavigateIframeInFencedFrame(nodeC1, kOrigin1Url2); + + auto* nodeD = AddNestedFencedFrame(nodeC1, 0); + ASSERT_NE(nullptr, nodeD); + NavigateNestedFencedFrame(nodeD, kOrigin1Url2); + + auto* nodeE1 = AddIframeInFencedFrame(nodeD, 0); + ASSERT_NE(nullptr, nodeE1); + NavigateIframeInFencedFrame(nodeE1, kOrigin1Url3); + + auto* nodeE2 = AddIframeInFencedFrame(nodeD, 1); + ASSERT_NE(nullptr, nodeE2); + NavigateIframeInFencedFrame(nodeE2, kOrigin2Url); + + auto* nodeC2 = AddIframeInFencedFrame(nodeB, 1); + ASSERT_NE(nullptr, nodeC2); + NavigateIframeInFencedFrame(nodeC2, kOrigin2Url); + + auto* nodeF = AddNestedFencedFrame(nodeA, 1); + ASSERT_NE(nullptr, nodeF); + NavigateNestedFencedFrame(nodeF, kOrigin1Url); + + auto* nodeG = AddIframeInFencedFrame(nodeF, 0); + ASSERT_NE(nullptr, nodeG); + NavigateIframeInFencedFrame(nodeG, kOrigin1Url2); + + // Now that the layout is set up, perform the actual user activation tests. + std::vector<FrameTreeNode*> nodes = {nodeA, nodeB, nodeC1, nodeD, nodeE1, + nodeE2, nodeC2, nodeF, nodeG}; + + // Create some helper functions so we can express the user activation + // notification test cases more concisely. + auto ClearAll = [&nodes]() { + // User activation can only be cleared per frame tree in MPArch, so we'll + // do it from every node just to be safe. + for (auto* node : nodes) { + node->current_frame_host()->UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kClearActivation, + blink::mojom::UserActivationNotificationType::kNone); + } + for (auto* node : nodes) { + EXPECT_FALSE(node->HasStickyUserActivation()); + EXPECT_FALSE(node->HasTransientUserActivation()); + } + }; + + auto Activate = [](FrameTreeNode* node) { + node->UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kNotifyActivation, + blink::mojom::UserActivationNotificationType::kTest); + }; + + auto EXPECT_STICKY = [&nodes](std::vector<bool> should_be_activated) { + ASSERT_EQ(nodes.size(), should_be_activated.size()); + for (size_t i = 0; i < nodes.size(); ++i) { + if (should_be_activated[i]) { + EXPECT_TRUE(nodes[i]->HasStickyUserActivation()); + EXPECT_TRUE(nodes[i]->HasTransientUserActivation()); + } else { + EXPECT_FALSE(nodes[i]->HasStickyUserActivation()); + EXPECT_FALSE(nodes[i]->HasTransientUserActivation()); + } + } + }; + + // Activate A, and check that no other frames are activated. + ClearAll(); // Clear all user activations before we start. + Activate(nodeA); + EXPECT_STICKY({true /*A*/, false /*B*/, false /*C1*/, false /*D*/, + false /*E1*/, false /*E2*/, false /*C2*/, false /*F*/, + false /*G*/}); + + // Activate B, and check that only B and C1 are activated. + ClearAll(); + Activate(nodeB); + EXPECT_STICKY({false /*A*/, true /*B*/, true /*C1*/, false /*D*/, + false /*E1*/, false /*E2*/, false /*C2*/, false /*F*/, + false /*G*/}); + + // Activate C1, and check that only B and C1 are activated. + ClearAll(); + Activate(nodeC1); + EXPECT_STICKY({false /*A*/, true /*B*/, true /*C1*/, false /*D*/, + false /*E1*/, false /*E2*/, false /*C2*/, false /*F*/, + false /*G*/}); + + // Activate C2, and check that only B and C2 are activated. + ClearAll(); + Activate(nodeC2); + EXPECT_STICKY({false /*A*/, true /*B*/, false /*C1*/, false /*D*/, + false /*E1*/, false /*E2*/, true /*C2*/, false /*F*/, + false /*G*/}); + + // Activate D, and check that only D and E1 are activated. + ClearAll(); + Activate(nodeD); + EXPECT_STICKY({false /*A*/, false /*B*/, false /*C1*/, true /*D*/, + true /*E1*/, false /*E2*/, false /*C2*/, false /*F*/, + false /*G*/}); + + // Activate E1, and check that only D and E1 are activated. + ClearAll(); + Activate(nodeE1); + EXPECT_STICKY({false /*A*/, false /*B*/, false /*C1*/, true /*D*/, + true /*E1*/, false /*E2*/, false /*C2*/, false /*F*/, + false /*G*/}); + + // Activate E2, and check that only D and E2 are activated. + ClearAll(); + Activate(nodeE2); + EXPECT_STICKY({false /*A*/, false /*B*/, false /*C1*/, true /*D*/, + false /*E1*/, true /*E2*/, false /*C2*/, false /*F*/, + false /*G*/}); + + // Activating F and G is equivalent to activating B and C1, so we omit them. + + // Create some helper functions so we can express the user activation + // consumption test cases more concisely. + auto ActivateAll = [&nodes]() { + // Activate every individual frame just to be safe. + for (auto* node : nodes) { + node->current_frame_host()->UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kNotifyActivation, + blink::mojom::UserActivationNotificationType::kTest); + } + for (auto* node : nodes) { + EXPECT_TRUE(node->HasStickyUserActivation()); + EXPECT_TRUE(node->HasTransientUserActivation()); + } + }; + + auto Consume = [](FrameTreeNode* node) { + node->UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kConsumeTransientActivation, + blink::mojom::UserActivationNotificationType::kTest); + }; + + auto EXPECT_TRANSIENT = [&nodes](std::vector<bool> should_be_activated) { + ASSERT_EQ(nodes.size(), should_be_activated.size()); + for (size_t i = 0; i < nodes.size(); ++i) { + EXPECT_TRUE(nodes[i]->HasStickyUserActivation()); + if (should_be_activated[i]) { + EXPECT_TRUE(nodes[i]->HasTransientUserActivation()); + } else { + EXPECT_FALSE(nodes[i]->HasTransientUserActivation()); + } + } + }; + + // These tests are the opposites of the ones above. + // Consume A, and check that no other frames are consumed. + ActivateAll(); // Activate all frames before we start. + Consume(nodeA); + EXPECT_TRANSIENT({false /*A*/, true /*B*/, true /*C1*/, true /*D*/, + true /*E1*/, true /*E2*/, true /*C2*/, true /*F*/, + true /*G*/}); + + // Consume B, and check that only B, C1, and C2 are consumed. + ActivateAll(); + Consume(nodeB); + EXPECT_TRANSIENT({true /*A*/, false /*B*/, false /*C1*/, true /*D*/, + true /*E1*/, true /*E2*/, false /*C2*/, true /*F*/, + true /*G*/}); + + // Consume C2, and check that only B, C1, and C2 are consumed. + ActivateAll(); + Consume(nodeC2); + EXPECT_TRANSIENT({true /*A*/, false /*B*/, false /*C1*/, true /*D*/, + true /*E1*/, true /*E2*/, false /*C2*/, true /*F*/, + true /*G*/}); + + // Consume D, and check that only D, E1, and E2 are consumed. + ActivateAll(); + Consume(nodeD); + EXPECT_TRANSIENT({true /*A*/, true /*B*/, true /*C1*/, false /*D*/, + false /*E1*/, false /*E2*/, true /*C2*/, true /*F*/, + true /*G*/}); + + // Consume E1, and check that only D, E1, and E2 are consumed. + ActivateAll(); + Consume(nodeE1); + EXPECT_TRANSIENT({true /*A*/, true /*B*/, true /*C1*/, false /*D*/, + false /*E1*/, false /*E2*/, true /*C2*/, true /*F*/, + true /*G*/}); +} + INSTANTIATE_TEST_SUITE_P( All, FencedFrameTreeBrowserTest, @@ -2987,7 +3215,7 @@ } // This is fenced frames test class differs on from FencedFrameTreeBrowserTest, -// by testing MPArcg fenced frames exclusively (no ShadowDOM types), through the +// by testing MPArch fenced frames exclusively (no ShadowDOM types), through the // use of FencedFrameTestHelper. class MPArchFencedFramesFrameTreeBrowserTest : public FrameTreeBrowserTest { public: @@ -3011,47 +3239,4 @@ content::test::FencedFrameTestHelper fenced_frame_helper_; }; -IN_PROC_BROWSER_TEST_F(MPArchFencedFramesFrameTreeBrowserTest, - UserActivationToOutermostParent) { - const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html"); - const GURL kFencedFrameUrl = - embedded_test_server()->GetURL("/fenced_frames/nested.html"); - - // 1. Load starting page. - EXPECT_TRUE(NavigateToURL(shell(), kInitialUrl)); - EXPECT_FALSE( - current_frame_host()->frame_tree_node()->HasStickyUserActivation()); - - // 2. Load fenced frame into starting page. - auto* fenced_frame_rfh = static_cast<RenderFrameHostImpl*>( - fenced_frame_test_helper().CreateFencedFrame(current_frame_host(), - kFencedFrameUrl)); - ASSERT_NE(nullptr, fenced_frame_rfh); - ASSERT_TRUE(fenced_frame_rfh->frame_tree_node()->child_count()); - auto* nested_frame_rfh = - fenced_frame_rfh->frame_tree_node()->child_at(0)->current_frame_host(); - - // 3. Clear the state for all render frame hosts - current_frame_host()->UpdateUserActivationState( - blink::mojom::UserActivationUpdateType::kClearActivation, - blink::mojom::UserActivationNotificationType::kNone); - - EXPECT_FALSE( - current_frame_host()->frame_tree_node()->HasStickyUserActivation()); - EXPECT_FALSE(fenced_frame_rfh->frame_tree_node()->HasStickyUserActivation()); - EXPECT_FALSE(nested_frame_rfh->frame_tree_node()->HasStickyUserActivation()); - - // 4. Update the state for the child fenced-frame and check that activation - // state has propagated to its parent. - fenced_frame_rfh->UpdateUserActivationState( - blink::mojom::UserActivationUpdateType::kNotifyActivation, - blink::mojom::UserActivationNotificationType::kTest); - EXPECT_TRUE( - current_frame_host()->frame_tree_node()->HasStickyUserActivation()); - EXPECT_TRUE(fenced_frame_rfh->frame_tree_node()->HasStickyUserActivation()); - // State update should not propagate to child nodes, even if they are same - // origin. - EXPECT_FALSE(nested_frame_rfh->frame_tree_node()->HasStickyUserActivation()); -} - } // namespace content
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc index 0f57355..abae855 100644 --- a/content/browser/renderer_host/frame_tree_node.cc +++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -614,29 +614,48 @@ bool FrameTreeNode::NotifyUserActivation( blink::mojom::UserActivationNotificationType notification_type) { + // User activation notifications shouldn't propagate into/out of fenced + // frames. + // For ShadowDOM, fenced frames are in the same frame tree as their embedder, + // so we need to perform additional checks to enforce the boundary. + // For MPArch, fenced frames have a separate frame tree, so this boundary is + // enforced by default. + // https://docs.google.com/document/d/1WnIhXOFycoje_sEoZR3Mo0YNSR2Ki7LABIC_HEWFaog + bool shadow_dom_fenced_frame_enabled = + blink::features::IsFencedFramesEnabled() && + blink::features::IsFencedFramesShadowDOMBased(); + // User Activation V2 requires activating all ancestor frames in addition to // the current frame. See // https://html.spec.whatwg.org/multipage/interaction.html#tracking-user-activation. for (RenderFrameHostImpl* rfh = current_frame_host(); rfh; rfh = rfh->GetParent()) { - // The use of GetParent above is acceptable with fenced frames, as - // the caller to this function will eventually reach - // RenderFrameHostManager::UpdateUserActivationState, which in turn will - // lead to the propagation of the user activation to all ancestors. rfh->DidReceiveUserActivation(); rfh->frame_tree_node()->user_activation_state_.Activate(notification_type); + + if (shadow_dom_fenced_frame_enabled && + rfh->frame_tree_node()->IsFencedFrameRoot()) { + break; + } } render_manager_.browsing_context_state()->set_has_active_user_gesture(true); + absl::optional<base::UnguessableToken> originator_nonce = + fenced_frame_nonce(); + // See the "Same-origin Visibility" section in |UserActivationState| class // doc. if (base::FeatureList::IsEnabled( - features::kUserActivationSameOriginVisibility) && - frame_tree()->type() != FrameTree::Type::kFencedFrame) { + features::kUserActivationSameOriginVisibility)) { const url::Origin& current_origin = this->current_frame_host()->GetLastCommittedOrigin(); for (FrameTreeNode* node : frame_tree()->Nodes()) { + if (shadow_dom_fenced_frame_enabled && + node->fenced_frame_nonce() != originator_nonce) { + continue; + } + if (node->current_frame_host()->GetLastCommittedOrigin().IsSameOriginWith( current_origin)) { node->user_activation_state_.Activate(notification_type); @@ -651,9 +670,28 @@ } bool FrameTreeNode::ConsumeTransientUserActivation() { + // User activation consumptions shouldn't propagate into/out of fenced + // frames. + // For ShadowDOM, fenced frames are in the same frame tree as their embedder, + // so we need to perform additional checks to enforce the boundary. + // For MPArch, fenced frames have a separate frame tree, so this boundary is + // enforced by default. + // https://docs.google.com/document/d/1WnIhXOFycoje_sEoZR3Mo0YNSR2Ki7LABIC_HEWFaog + bool shadow_dom_fenced_frame_enabled = + blink::features::IsFencedFramesEnabled() && + blink::features::IsFencedFramesShadowDOMBased(); + absl::optional<base::UnguessableToken> originator_nonce = + fenced_frame_nonce(); + bool was_active = user_activation_state_.IsActive(); - for (FrameTreeNode* node : frame_tree()->Nodes()) + for (FrameTreeNode* node : frame_tree()->Nodes()) { + if (shadow_dom_fenced_frame_enabled && + node->fenced_frame_nonce() != originator_nonce) { + continue; + } + node->user_activation_state_.ConsumeIfActive(); + } render_manager_.browsing_context_state()->set_has_active_user_gesture(false); return was_active; }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 1234087..852aa42 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -6725,18 +6725,23 @@ effective_transient_activation_state, params->opener_suppressed, &no_javascript_access); - bool was_consumed = false; - if (can_create_window) { - // Consume activation even w/o User Activation v2, to sync other renderers - // with calling renderer. - was_consumed = frame_tree_node_->UpdateUserActivationState( - blink::mojom::UserActivationUpdateType::kConsumeTransientActivation, - blink::mojom::UserActivationNotificationType::kNone); - } else { - std::move(callback).Run(mojom::CreateNewWindowStatus::kIgnore, nullptr); + // If this frame isn't allowed to create a window, return early (before we + // consume transient user activation). + if (!can_create_window) { + std::move(callback).Run(mojom::CreateNewWindowStatus::kBlocked, nullptr); return; } + // Otherwise, consume user activation before we proceed. In particular, it is + // important to do this before we return from the |opener_suppressed| case + // below. + // NB: This call will consume activations in the browser and the remote frame + // proxies for this frame. The initiating renderer will consume its view of + // the activations after we return. + bool was_consumed = frame_tree_node_->UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kConsumeTransientActivation, + blink::mojom::UserActivationNotificationType::kNone); + // For Android WebView, we support a pop-up like behavior for window.open() // even if the embedding app doesn't support multiple windows. In this case, // window.open() will return "window" and navigate it to whatever URL was
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 9896ca1..894f0f7 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1439,6 +1439,12 @@ void RenderFrameHostManager::UpdateUserActivationState( blink::mojom::UserActivationUpdateType update_type, blink::mojom::UserActivationNotificationType notification_type) { + // Don't propagate user activations out of fenced frame trees. + FrameTreeNode* root = frame_tree_node_->frame_tree()->root(); + if (root->IsFencedFrameRoot()) { + return; + } + for (const auto& pair : browsing_context_state_->proxy_hosts()) { RenderFrameProxyHost* proxy = pair.second.get(); proxy->GetAssociatedRemoteFrame()->UpdateUserActivationState( @@ -1452,10 +1458,8 @@ // TODO(mustaq): We should add activation consumption propagation from inner // to outer delegates, and also all state propagation from outer to inner // delegates. crbug.com/1026617. - RenderFrameProxyHost* outer_delegate_proxy = frame_tree_node_->frame_tree() - ->root() - ->render_manager() - ->GetProxyToOuterDelegate(); + RenderFrameProxyHost* outer_delegate_proxy = + root->render_manager()->GetProxyToOuterDelegate(); if (outer_delegate_proxy && update_type == blink::mojom::UserActivationUpdateType::kNotifyActivation) {
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc index 6683f22..2b02837f 100644 --- a/content/browser/service_worker/service_worker_registry.cc +++ b/content/browser/service_worker/service_worker_registry.cc
@@ -79,9 +79,15 @@ status, std::move(callback))); } -void RecordRetryCount(size_t retries) { +void RecordRetryCount(size_t retries, size_t queue_size) { base::UmaHistogramCounts100("ServiceWorker.Storage.RetryCountForRecovery", retries); + + // We've seen traces with 14,000 ServiceWorkerStorageControl tasks + // (https://crbug.com/1302111), so ensure more than that can fit in the + // histogram buckets in case those were queued retries. + base::UmaHistogramCounts100000( + "ServiceWorker.Storage.RetryQueueSizeForRecovery", queue_size); } // Notifies quota manager that a disk write operation failed so that it can @@ -1569,7 +1575,7 @@ if (connection_state_ == ConnectionState::kRecovering) { ++recovery_retry_counts_; if (recovery_retry_counts_ > kMaxRetryCounts) { - RecordRetryCount(kMaxRetryCounts); + RecordRetryCount(kMaxRetryCounts, inflight_calls_.size()); CHECK(false) << "The Storage Service consistently crashes."; return; } @@ -1592,7 +1598,7 @@ void ServiceWorkerRegistry::DidRecover() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - RecordRetryCount(recovery_retry_counts_); + RecordRetryCount(recovery_retry_counts_, inflight_calls_.size()); recovery_retry_counts_ = 0; connection_state_ = ConnectionState::kNormal;
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index 7006c51c..4e95076c 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -13,7 +13,6 @@ #include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/browser/webid/fedcm_metrics.h" #include "content/browser/webid/flags.h" -#include "content/browser/webid/id_token_request_callback_data.h" #include "content/browser/webid/webid_utils.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" @@ -31,9 +30,7 @@ using blink::mojom::FederatedAuthRequestResult; using blink::mojom::LogoutRpsStatus; using blink::mojom::RequestIdTokenStatus; -using blink::mojom::RequestMode; using blink::mojom::RevokeStatus; -using UserApproval = content::IdentityRequestDialogController::UserApproval; using LoginState = content::IdentityRequestAccount::LoginState; using SignInMode = content::IdentityRequestAccount::SignInMode; using IdTokenStatus = content::FedCmRequestIdTokenStatus; @@ -48,21 +45,6 @@ // https://crbug.com/1298316. static constexpr base::TimeDelta kRequestRejectionDelay = base::Seconds(60); -std::string FormatRequestParams(const std::string& client_id, - const std::string& nonce) { - std::string query; - // 'openid' scope is required for IdPs using OpenID Connect. We hope that IdPs - // using OAuth will ignore it, although some might return errors. - query += "scope=openid profile email"; - if (client_id.length() > 0) { - query += "&client_id=" + client_id; - } - if (nonce.length() > 0) { - query += "&nonce=" + nonce; - } - return query; -} - std::string FormatRequestParamsWithoutScope(const std::string& client_id, const std::string& nonce, const std::string& account_id, @@ -243,7 +225,6 @@ const GURL& provider, const std::string& client_id, const std::string& nonce, - RequestMode mode, bool prefer_auto_sign_in, blink::mojom::FederatedAuthRequest::RequestIdTokenCallback callback) { if (HasPendingRequest()) { @@ -257,7 +238,6 @@ provider_ = provider; client_id_ = client_id; nonce_ = nonce; - mode_ = mode; prefer_auto_sign_in_ = prefer_auto_sign_in && IsFedCmAutoSigninEnabled(); start_time_ = base::TimeTicks::Now(); delay_timer_.Reset(); @@ -275,29 +255,8 @@ request_dialog_controller_ = CreateDialogController(); - // Skip request permission if it is already given for this IDP or if we are - // using the mediated mode in which case the permission is combined with - // account selector UI. - if (mode_ == RequestMode::kMediated || - (GetRequestPermissionContext() && - GetRequestPermissionContext()->HasRequestPermission( - origin_, url::Origin::Create(provider_)))) { - FetchManifest(base::BindOnce(&FederatedAuthRequestImpl::OnManifestFetched, - weak_ptr_factory_.GetWeakPtr())); - return; - } - - DCHECK_EQ(mode_, RequestMode::kPermission); - // Use the web contents of the page that initiated the WebID request (i.e. - // the Relying Party) for showing the initial permission dialog. - WebContents* web_contents = - WebContents::FromRenderFrameHost(render_frame_host_); - - request_dialog_controller_->ShowInitialPermissionDialog( - web_contents, provider_, - IdentityRequestDialogController::PermissionDialogMode::kStateful, - base::BindOnce(&FederatedAuthRequestImpl::OnSigninApproved, - weak_ptr_factory_.GetWeakPtr())); + FetchManifest(base::BindOnce(&FederatedAuthRequestImpl::OnManifestFetched, + weak_ptr_factory_.GetWeakPtr())); } void FederatedAuthRequestImpl::CancelTokenRequest() { @@ -473,59 +432,32 @@ endpoints_.accounts = ResolveManifestUrl(endpoints.accounts); endpoints_.client_metadata = ResolveManifestUrl(endpoints.client_metadata); - switch (mode_) { - case RequestMode::kMediated: { - // For Mediated mode we require accounts, token and client ID endpoints. - if (endpoints_.token.is_empty() || endpoints_.accounts.is_empty() || - endpoints_.client_metadata.is_empty()) { - RecordRequestIdTokenStatus(IdTokenStatus::kManifestInvalidResponse, - render_frame_host_->GetPageUkmSourceId()); - CompleteRequest( - FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, - "", /*should_call_callback=*/false); - return; - } - if (!IsEndpointUrlValid(endpoints_.token) || - !IsEndpointUrlValid(endpoints_.accounts) || - !IsEndpointUrlValid(endpoints_.client_metadata)) { - RecordRequestIdTokenStatus(IdTokenStatus::kManifestInvalidResponse, - render_frame_host_->GetPageUkmSourceId()); - CompleteRequest( - FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, - "", /*should_call_callback=*/false); - return; - } - GURL brand_icon_url = idp_metadata.brand_icon_url; - DownloadBitmap( - brand_icon_url, request_dialog_controller_->GetBrandIconIdealSize(), - base::BindOnce(&FederatedAuthRequestImpl::OnBrandIconDownloaded, - weak_ptr_factory_.GetWeakPtr(), - request_dialog_controller_->GetBrandIconMinimumSize(), - std::move(idp_metadata))); - break; - } - case RequestMode::kPermission: { - // For Permission mode we require both accounts and token endpoints. - if (endpoints_.idp.is_empty()) { - CompleteRequest( - FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, - "", /*should_call_callback=*/false); - return; - } - if (!IsEndpointUrlValid(endpoints_.idp)) { - CompleteRequest( - FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, - "", /*should_call_callback=*/false); - return; - } - - network_manager_->SendSigninRequest( - endpoints_.idp, FormatRequestParams(client_id_, nonce_), - base::BindOnce(&FederatedAuthRequestImpl::OnSigninResponseReceived, - weak_ptr_factory_.GetWeakPtr())); - break; - } + if (endpoints_.token.is_empty() || endpoints_.accounts.is_empty() || + endpoints_.client_metadata.is_empty()) { + RecordRequestIdTokenStatus(IdTokenStatus::kManifestInvalidResponse, + render_frame_host_->GetPageUkmSourceId()); + CompleteRequest( + FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, "", + /*should_call_callback=*/false); + return; } + if (!IsEndpointUrlValid(endpoints_.token) || + !IsEndpointUrlValid(endpoints_.accounts) || + !IsEndpointUrlValid(endpoints_.client_metadata)) { + RecordRequestIdTokenStatus(IdTokenStatus::kManifestInvalidResponse, + render_frame_host_->GetPageUkmSourceId()); + CompleteRequest( + FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, "", + /*should_call_callback=*/false); + return; + } + GURL brand_icon_url = idp_metadata.brand_icon_url; + DownloadBitmap( + brand_icon_url, request_dialog_controller_->GetBrandIconIdealSize(), + base::BindOnce(&FederatedAuthRequestImpl::OnBrandIconDownloaded, + weak_ptr_factory_.GetWeakPtr(), + request_dialog_controller_->GetBrandIconMinimumSize(), + std::move(idp_metadata))); } void FederatedAuthRequestImpl::OnManifestFetchedForRevoke( @@ -694,150 +626,6 @@ } } -void FederatedAuthRequestImpl::OnSigninApproved( - IdentityRequestDialogController::UserApproval approval) { - if (approval != IdentityRequestDialogController::UserApproval::kApproved) { - CompleteRequest(FederatedAuthRequestResult::kApprovalDeclined, "", - /*should_call_callback=*/true); - return; - } - - if (GetRequestPermissionContext()) { - GetRequestPermissionContext()->GrantRequestPermission( - origin_, url::Origin::Create(provider_)); - } - - FetchManifest(base::BindOnce(&FederatedAuthRequestImpl::OnManifestFetched, - weak_ptr_factory_.GetWeakPtr())); -} - -void FederatedAuthRequestImpl::OnSigninResponseReceived( - IdpNetworkRequestManager::SigninResponse status, - const std::string& url_or_token) { - // |url_or_token| is either the URL for the sign-in page or the ID token, - // depending on |status|. - switch (status) { - case IdpNetworkRequestManager::SigninResponse::kLoadIdp: { - GURL idp_signin_page_url = endpoints_.idp.Resolve(url_or_token); - if (!IsEndpointUrlValid(idp_signin_page_url)) { - CompleteRequest(FederatedAuthRequestResult::kError, "", - /*should_call_callback=*/false); - return; - } - WebContents* rp_web_contents = - WebContents::FromRenderFrameHost(render_frame_host_); - - DCHECK(!idp_web_contents_); - idp_web_contents_ = CreateIdpWebContents(); - request_dialog_controller_->ShowIdProviderWindow( - rp_web_contents, idp_web_contents_.get(), idp_signin_page_url, - base::BindOnce(&FederatedAuthRequestImpl::OnIdpPageClosed, - weak_ptr_factory_.GetWeakPtr())); - return; - } - case IdpNetworkRequestManager::SigninResponse::kTokenGranted: { - // TODO(kenrb): Returning success here has to be dependent on whether - // a WebID flow has succeeded in the past, otherwise jump to - // the token permission dialog. - CompleteRequest(FederatedAuthRequestResult::kSuccess, url_or_token, - /*should_call_callback=*/true); - return; - } - case IdpNetworkRequestManager::SigninResponse::kSigninError: { - CompleteRequest(FederatedAuthRequestResult::kErrorFetchingSignin, "", - /*should_call_callback=*/false); - return; - } - case IdpNetworkRequestManager::SigninResponse::kInvalidResponseError: { - CompleteRequest(FederatedAuthRequestResult::kErrorInvalidSigninResponse, - "", /*should_call_callback=*/false); - return; - } - } -} - -void FederatedAuthRequestImpl::OnTokenProvided(const std::string& id_token) { - id_token_ = id_token; - - // Close the IDP window which leads to OnIdpPageClosed which is our common. - // - // TODO(majidvp): Consider if we should not wait on the IDP window closing and - // instead should directly call `OnIdpPageClosed` here. - request_dialog_controller_->CloseIdProviderWindow(); - - // Note that we always process the token on `OnIdpPageClosed()`. - // It is possible to get there either via: - // (a) IDP providing a token as shown below, or - // (b) User closing the sign-in window. - // - // +-----------------------+ +-------------------+ +-----------------+ - // | FederatedAuthRequest | | DialogController | | IDPWebContents | - // +-----------------------+ +-------------------+ +-----------------+ - // | | | - // | ShowIdProviderWindow() | | - // |-------------------------->| | - // | | | - // | | navigate to idp.com | - // | |----------------------->| - // | | | - // | | OnTokenProvided(token)| - // |<---------------------------------------------------| - // | | | - // | CloseIdProviderWindow() | | - // |-------------------------->| | - // | | | - // | closed | | - // |<--------------------------| | - // | | | - // OnIdpPageClosed() | | - // | | | - // -} - -void FederatedAuthRequestImpl::OnIdpPageClosed() { - // This could happen if provider didn't provide any token or user closed the - // IdP window before it could. - if (id_token_.empty()) { - CompleteRequest(FederatedAuthRequestResult::kError, "", - /*should_call_callback=*/false); - return; - } - - WebContents* rp_web_contents = - WebContents::FromRenderFrameHost(render_frame_host_); - - if (GetSharingPermissionContext() && - GetSharingPermissionContext()->HasSharingPermission( - url::Origin::Create(provider_), origin_)) { - CompleteRequest(FederatedAuthRequestResult::kSuccess, id_token_, - /*should_call_callback=*/true); - return; - } - - request_dialog_controller_->ShowTokenExchangePermissionDialog( - rp_web_contents, provider_, - base::BindOnce(&FederatedAuthRequestImpl::OnTokenProvisionApproved, - weak_ptr_factory_.GetWeakPtr())); -} - -void FederatedAuthRequestImpl::OnTokenProvisionApproved( - IdentityRequestDialogController::UserApproval approval) { - if (approval != IdentityRequestDialogController::UserApproval::kApproved) { - CompleteRequest(FederatedAuthRequestResult::kApprovalDeclined, "", - /*should_call_callback=*/true); - return; - } - - if (GetSharingPermissionContext()) { - // Grant sharing permission for RP/IDP pair without a specific account. - GetSharingPermissionContext()->GrantSharingPermission( - url::Origin::Create(provider_), origin_); - } - - CompleteRequest(FederatedAuthRequestResult::kSuccess, id_token_, - /*should_call_callback=*/true); -} - void FederatedAuthRequestImpl::DownloadBitmap( const GURL& icon_url, int ideal_icon_size, @@ -916,8 +704,6 @@ account.login_state = login_state; } - DCHECK(!idp_web_contents_); - idp_web_contents_ = CreateIdpWebContents(); bool screen_reader_is_on = rp_web_contents->GetAccessibilityMode().has_mode( ui::AXMode::kScreenReader); @@ -936,8 +722,7 @@ render_frame_host_->GetPageUkmSourceId()); request_dialog_controller_->ShowAccountsDialog( - rp_web_contents, idp_web_contents_.get(), provider_, accounts, - idp_metadata, data, + rp_web_contents, provider_, accounts, idp_metadata, data, is_auto_sign_in ? SignInMode::kAuto : SignInMode::kExplicit, base::BindOnce(&FederatedAuthRequestImpl::OnAccountSelected, weak_ptr_factory_.GetWeakPtr())); @@ -1045,7 +830,6 @@ } case IdpNetworkRequestManager::FetchStatus::kSuccess: { if (GetSharingPermissionContext()) { - DCHECK_EQ(mode_, RequestMode::kMediated); // Grant sharing permission specific to *this account*. // // TODO(majidvp): But wait which account? @@ -1072,10 +856,9 @@ id_token_response_time_ - select_account_time_, id_token_response_time_ - start_time_, render_frame_host_->GetPageUkmSourceId()); - id_token_ = id_token; RecordRequestIdTokenStatus(IdTokenStatus::kSuccess, render_frame_host_->GetPageUkmSourceId()); - CompleteRequest(FederatedAuthRequestResult::kSuccess, id_token_, + CompleteRequest(FederatedAuthRequestResult::kSuccess, id_token, /*should_call_callback=*/true); return; } @@ -1121,19 +904,6 @@ DispatchOneLogout(); } -std::unique_ptr<WebContents> FederatedAuthRequestImpl::CreateIdpWebContents() { - auto idp_web_contents = content::WebContents::Create( - WebContents::CreateParams(render_frame_host_->GetBrowserContext())); - - // Store the callback on the provider web contents so that it can be - // used later. - IdTokenRequestCallbackData::Set( - idp_web_contents.get(), - base::BindOnce(&FederatedAuthRequestImpl::OnTokenProvided, - weak_ptr_factory_.GetWeakPtr())); - return idp_web_contents; -} - void FederatedAuthRequestImpl::CompleteRequest( blink::mojom::FederatedAuthRequestResult result, const std::string& id_token, @@ -1171,7 +941,6 @@ network_manager_.reset(); // Given that |request_dialog_controller_| has reference to this web content // instance we destroy that first. - idp_web_contents_.reset(); account_id_ = std::string(); start_time_ = base::TimeTicks(); show_accounts_dialog_time_ = base::TimeTicks();
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h index 1b3b29e..3006e88d 100644 --- a/content/browser/webid/federated_auth_request_impl.h +++ b/content/browser/webid/federated_auth_request_impl.h
@@ -47,7 +47,6 @@ const GURL& provider, const std::string& client_id, const std::string& nonce, - blink::mojom::RequestMode mode, bool prefer_auto_sign_in, blink::mojom::FederatedAuthRequest::RequestIdTokenCallback); void CancelTokenRequest(); @@ -95,14 +94,6 @@ IdpNetworkRequestManager::FetchStatus status, IdpNetworkRequestManager::ClientMetadata data); - void OnSigninApproved(IdentityRequestDialogController::UserApproval approval); - void OnSigninResponseReceived(IdpNetworkRequestManager::SigninResponse status, - const std::string& url_or_token); - void OnTokenProvided(const std::string& id_token); - void OnIdpPageClosed(); - void OnTokenProvisionApproved( - IdentityRequestDialogController::UserApproval approval); - void DownloadBitmap(const GURL& icon_url, int ideal_icon_size, WebContents::ImageDownloadCallback callback); @@ -117,11 +108,6 @@ const std::string& id_token); void DispatchOneLogout(); void OnLogoutCompleted(); - std::unique_ptr<WebContents> CreateIdpWebContents(); - // |should_call_callback| represents whether we should call the callback to - // either resolve or reject the promise immediately when the renderer receives - // the IPC from the browser. For some failures we choose to reject with - // |delay_timer_| for privacy reasons. void CompleteRequest(blink::mojom::FederatedAuthRequestResult, const std::string& id_token, bool should_call_callback); @@ -185,8 +171,6 @@ std::string client_id_; std::string nonce_; - blink::mojom::RequestMode mode_; - bool prefer_auto_sign_in_; // Fetched from the IDP FedCM manifest configuration. @@ -197,12 +181,6 @@ GURL client_metadata; } endpoints_; - // The WebContents that is used to load the IDP sign-up page. This is - // created here to allow us to setup proper callbacks on it using - // |IdTokenRequestCallbackData|. It is then passed along to - // chrome/browser/ui machinery to be used to load IDP sign-in content. - std::unique_ptr<WebContents> idp_web_contents_; - raw_ptr<FederatedIdentityActiveSessionPermissionContextDelegate> active_session_permission_delegate_ = nullptr; raw_ptr<FederatedIdentityRequestPermissionContextDelegate> @@ -214,7 +192,6 @@ // The account that was selected by the user. This is only applicable to the // mediation flow. std::string account_id_; - std::string id_token_; base::TimeTicks start_time_; base::TimeTicks show_accounts_dialog_time_; base::TimeTicks select_account_time_;
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index b8957e5..239fa13 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -18,7 +18,6 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/webid/fedcm_metrics.h" #include "content/browser/webid/federated_auth_request_service.h" -#include "content/browser/webid/id_token_request_callback_data.h" #include "content/browser/webid/test/mock_active_session_permission_delegate.h" #include "content/browser/webid/test/mock_identity_request_dialog_controller.h" #include "content/browser/webid/test/mock_idp_network_request_manager.h" @@ -44,7 +43,6 @@ using blink::mojom::LogoutRpsRequestPtr; using blink::mojom::LogoutRpsStatus; using blink::mojom::RequestIdTokenStatus; -using blink::mojom::RequestMode; using blink::mojom::RevokeStatus; using Entry = ukm::builders::Blink_FedCm; using FetchStatus = content::IdpNetworkRequestManager::FetchStatus; @@ -79,7 +77,6 @@ constexpr char kRevokeEndpoint[] = "https://idp.example/revoke"; constexpr char kPrivacyPolicyUrl[] = "https://rp.example/pp"; constexpr char kTermsOfServiceUrl[] = "https://rp.example/tos"; -constexpr char kSigninUrl[] = "https://idp.example/signin"; constexpr char kClientId[] = "client_id_123"; constexpr char kNonce[] = "nonce123"; @@ -100,7 +97,6 @@ const char* provider; const char* client_id; const char* nonce; - RequestMode mode; bool prefer_auto_sign_in; } RequestParameters; @@ -119,12 +115,6 @@ }; typedef struct { - absl::optional<SigninResponse> signin_response; - const char* signin_url_or_token; - absl::optional<UserApproval> token_permission; -} MockPermissionConfiguration; - -typedef struct { absl::optional<FetchStatus> accounts_response; AccountList accounts; absl::optional<FetchStatus> token_response; @@ -133,14 +123,12 @@ typedef struct { const char* token; - absl::optional<UserApproval> initial_permission; absl::optional<FetchStatus> manifest_fetch_status; absl::optional<MockClientIdConfiguration> client_metadata; const char* idp_endpoint; const char* accounts_endpoint; const char* token_endpoint; const char* client_metadata_endpoint; - MockPermissionConfiguration Permission_conf; MockMediatedConfiguration Mediated_conf; } MockConfiguration; @@ -162,8 +150,6 @@ static const MockMediatedConfiguration kMediatedNoop{absl::nullopt, kAccounts, absl::nullopt}; -static const MockPermissionConfiguration kPermissionNoop{absl::nullopt, "", - absl::nullopt}; static const MockClientIdConfiguration kSuccessfulClientId{ FetchStatus::kSuccess, kPrivacyPolicyUrl, kTermsOfServiceUrl}; @@ -176,230 +162,99 @@ static const MockClientIdConfiguration kClientMetadataInvalidResponse{ FetchStatus::kInvalidResponseError, "", ""}; -static const AuthRequestTestCase kPermissionTestCases[]{ - {"Successful run with the IdP page loaded", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, - kToken}, - {kToken, - UserApproval::kApproved, - FetchStatus::kSuccess, - absl::nullopt, - kIdpEndpoint, - "", - "", - "", - {SigninResponse::kLoadIdp, kSigninUrl, UserApproval::kApproved}, - kMediatedNoop}}, - - {"Successful run with a token response from the idp_endpoint", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, - kToken}, - {kToken, - UserApproval::kApproved, - FetchStatus::kSuccess, - absl::nullopt, - kIdpEndpoint, - "", - "", - "", - {SigninResponse::kTokenGranted, kToken, absl::nullopt}, - kMediatedNoop}}, - - {"Initial user permission denied", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kApprovalDeclined, - FederatedAuthRequestResult::kApprovalDeclined, kEmptyToken}, - {kToken, UserApproval::kDenied, absl::nullopt, absl::nullopt, "", "", "", - "", kPermissionNoop, kMediatedNoop}}, - - {"FedCM manifest file not found", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kError, - FederatedAuthRequestResult::kErrorFetchingManifestHttpNotFound, - kEmptyToken}, - {kToken, UserApproval::kApproved, FetchStatus::kHttpNotFoundError, - absl::nullopt, "", "", "", "", kPermissionNoop, kMediatedNoop}}, - - {"FedCM manifest fetch error", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kError, - FederatedAuthRequestResult::kErrorFetchingManifestNoResponse, - kEmptyToken}, - {kToken, UserApproval::kApproved, FetchStatus::kNoResponseError, - absl::nullopt, "", "", "", "", kPermissionNoop, kMediatedNoop}}, - - {"Error parsing FedCM manifest for Permission mode", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kError, - FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, - kEmptyToken}, - {kToken, UserApproval::kApproved, FetchStatus::kInvalidResponseError, - absl::nullopt, "", kAccountsEndpoint, kTokenEndpoint, "", kPermissionNoop, - kMediatedNoop}}, - - {"Error reaching the idpendpoint", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kErrorFetchingSignin, - FederatedAuthRequestResult::kErrorFetchingSignin, kEmptyToken}, - {kToken, - UserApproval::kApproved, - FetchStatus::kSuccess, - absl::nullopt, - kIdpEndpoint, - "", - "", - "", - {SigninResponse::kSigninError, "", absl::nullopt}, - kMediatedNoop}}, - - {"Error parsing the idpendpoint response", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kErrorInvalidSigninResponse, - FederatedAuthRequestResult::kErrorInvalidSigninResponse, kEmptyToken}, - {kToken, - UserApproval::kApproved, - FetchStatus::kSuccess, - absl::nullopt, - kIdpEndpoint, - "", - "", - "", - {SigninResponse::kInvalidResponseError, "", absl::nullopt}, - kMediatedNoop}}, - - {"IdP window closed before token provision", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kError, - kEmptyToken}, - {kEmptyToken, - UserApproval::kApproved, - FetchStatus::kSuccess, - absl::nullopt, - kIdpEndpoint, - "", - "", - "", - {SigninResponse::kLoadIdp, kSigninUrl, absl::nullopt}, - kMediatedNoop}}, - - {"Token provision declined by user after IdP window closed", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kPermission}, - {RequestIdTokenStatus::kApprovalDeclined, - FederatedAuthRequestResult::kApprovalDeclined, kEmptyToken}, - {kToken, - UserApproval::kApproved, - FetchStatus::kSuccess, - absl::nullopt, - kIdpEndpoint, - "", - "", - "", - {SigninResponse::kLoadIdp, kSigninUrl, UserApproval::kDenied}, - kMediatedNoop}}}; - static const AuthRequestTestCase kMediatedTestCases[]{ {"Error parsing FedCM manifest for Mediated mode missing token endpoint", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, kEmptyToken}, - {kToken, absl::nullopt, FetchStatus::kInvalidResponseError, absl::nullopt, - kIdpEndpoint, kAccountsEndpoint, "", kClientMetadataEndpoint, - kPermissionNoop, kMediatedNoop}}, + {kToken, FetchStatus::kInvalidResponseError, absl::nullopt, kIdpEndpoint, + kAccountsEndpoint, "", kClientMetadataEndpoint, kMediatedNoop}}, {"Error parsing FedCM manifest for Mediated mode missing accounts endpoint", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, kEmptyToken}, - {kToken, absl::nullopt, FetchStatus::kSuccess, absl::nullopt, kIdpEndpoint, - "", kTokenEndpoint, kClientMetadataEndpoint, kPermissionNoop, - kMediatedNoop}}, + {kToken, FetchStatus::kSuccess, absl::nullopt, kIdpEndpoint, "", + kTokenEndpoint, kClientMetadataEndpoint, kMediatedNoop}}, {"Error due to accounts endpoint in different origin than identity " "provider", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, kEmptyToken}, - {kToken, absl::nullopt, FetchStatus::kSuccess, absl::nullopt, kIdpEndpoint, + {kToken, FetchStatus::kSuccess, absl::nullopt, kIdpEndpoint, kCrossOriginAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, kMediatedNoop}}, + kMediatedNoop}}, {"Error reaching Accounts endpoint", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingAccountsNoResponse, kEmptyToken}, {kEmptyToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kNoResponseError, kAccounts, absl::nullopt}}}, {"Error parsing Accounts response", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingAccountsInvalidResponse, kEmptyToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kInvalidResponseError, kAccounts, absl::nullopt}}}, {"Successful Mediated flow", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, kToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kSuccess, kAccounts, FetchStatus::kSuccess}}}, {"Client metadata file not found", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingClientMetadataHttpNotFound, kEmptyToken}, - {kToken, absl::nullopt, FetchStatus::kSuccess, kClientMetadataHttpNotFound, - "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, kMediatedNoop}}, + {kToken, FetchStatus::kSuccess, kClientMetadataHttpNotFound, "", + kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, + kMediatedNoop}}, {"Client metadata empty response", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingClientMetadataNoResponse, kEmptyToken}, - {kToken, absl::nullopt, FetchStatus::kSuccess, kClientMetadataNoResponse, - "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, kMediatedNoop}}, + {kToken, FetchStatus::kSuccess, kClientMetadataNoResponse, "", + kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, + kMediatedNoop}}, {"Client metadata invalid response", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated}, + {kIdpTestOrigin, kClientId, kNonce}, {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingClientMetadataInvalidResponse, kEmptyToken}, - {kToken, absl::nullopt, FetchStatus::kSuccess, - kClientMetadataInvalidResponse, "", kAccountsEndpoint, kTokenEndpoint, - kClientMetadataEndpoint, kPermissionNoop, kMediatedNoop}}, + {kToken, FetchStatus::kSuccess, kClientMetadataInvalidResponse, "", + kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, + kMediatedNoop}}, }; // Helper class for receiving the mojo method callback. @@ -570,10 +425,9 @@ std::pair<RequestIdTokenStatus, absl::optional<std::string>> PerformAuthRequest(const std::string& client_id, const std::string& nonce, - blink::mojom::RequestMode mode, bool prefer_auto_sign_in) { AuthRequestCallbackHelper auth_helper; - request_remote_->RequestIdToken(provider_, client_id, nonce, mode, + request_remote_->RequestIdToken(provider_, client_id, nonce, prefer_auto_sign_in, auth_helper.callback()); auth_helper.WaitForCallback(); @@ -601,53 +455,6 @@ return revoke_helper.status(); } - void SetPermissionMockExpectations(const MockPermissionConfiguration& conf, - std::string token) { - if (conf.signin_response) { - EXPECT_CALL(*mock_request_manager_, SendSigninRequest(_, _, _)) - .WillOnce(Invoke( - [&](const GURL&, const std::string&, - IdpNetworkRequestManager::SigninRequestCallback callback) { - std::move(callback).Run(*conf.signin_response, - conf.signin_url_or_token); - })); - } - - // The IdP dialog only shows when kLoadIdP is the return code from the - // signin request. - if (conf.signin_response == SigninResponse::kLoadIdp) { - EXPECT_CALL(*mock_dialog_controller_, ShowIdProviderWindow(_, _, _, _)) - .WillOnce(Invoke([=](WebContents*, WebContents* idp_web_contents, - const GURL&, - IdentityRequestDialogController:: - IdProviderWindowClosedCallback callback) { - close_idp_window_callback_ = std::move(callback); - auto* request_callback_data = - IdTokenRequestCallbackData::Get(idp_web_contents); - EXPECT_TRUE(request_callback_data); - auto rp_done_callback = request_callback_data->TakeDoneCallback(); - IdTokenRequestCallbackData::Remove(idp_web_contents); - EXPECT_TRUE(rp_done_callback); - std::move(rp_done_callback).Run(token); - })); - - EXPECT_CALL(*mock_dialog_controller_, CloseIdProviderWindow()) - .WillOnce( - Invoke([&]() { std::move(close_idp_window_callback_).Run(); })); - } - - if (conf.token_permission) { - EXPECT_CALL(*mock_dialog_controller_, - ShowTokenExchangePermissionDialog(_, _, _)) - .WillOnce(Invoke( - [&](content::WebContents* idp_web_contents, const GURL& idp_url, - IdentityRequestDialogController::TokenExchangeApprovalCallback - callback) { - std::move(callback).Run(*conf.token_permission); - })); - } - } - void SetMediatedMockExpectations(const MockMediatedConfiguration& conf, std::string token, bool prefer_auto_sign_in) { @@ -670,10 +477,9 @@ // e.g. for sign up flow, multiple accounts, user opt-out etc. In this // case, it's up to the test to expect this mock function call. EXPECT_CALL(*mock_dialog_controller_, - ShowAccountsDialog(_, _, _, _, _, _, _, _)) + ShowAccountsDialog(_, _, _, _, _, _, _)) .WillOnce(Invoke( [&](content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_signin_url, base::span<const content::IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, @@ -689,7 +495,7 @@ } } else { EXPECT_CALL(*mock_dialog_controller_, - ShowAccountsDialog(_, _, _, _, _, _, _, _)) + ShowAccountsDialog(_, _, _, _, _, _, _)) .Times(0); } @@ -711,22 +517,6 @@ } void SetMockExpectations(const AuthRequestTestCase& test_case) { - if (test_case.config.initial_permission) { - EXPECT_CALL(*mock_dialog_controller_, - ShowInitialPermissionDialog(_, _, _, _)) - .WillOnce(Invoke( - [&](WebContents*, const GURL&, - IdentityRequestDialogController::PermissionDialogMode, - IdentityRequestDialogController::InitialApprovalCallback - callback) { - std::move(callback).Run(*test_case.config.initial_permission); - })); - } else { - EXPECT_CALL(*mock_dialog_controller_, - ShowInitialPermissionDialog(_, _, _, _)) - .Times(0); - } - if (test_case.config.manifest_fetch_status) { EXPECT_CALL(*mock_request_manager_, FetchManifest(_, _, _)) .WillOnce(Invoke( @@ -764,8 +554,6 @@ .Times(0); } - SetPermissionMockExpectations(test_case.config.Permission_conf, - test_case.config.token); SetMediatedMockExpectations(test_case.config.Mediated_conf, test_case.config.token, test_case.inputs.prefer_auto_sign_in); @@ -910,11 +698,6 @@ : public FederatedAuthRequestImplTest, public ::testing::WithParamInterface<AuthRequestTestCase> {}; -INSTANTIATE_TEST_SUITE_P(PermissionTests, - BasicFederatedAuthRequestImplTest, - ::testing::ValuesIn(kPermissionTestCases), - ::testing::PrintToStringParamName()); - INSTANTIATE_TEST_SUITE_P(MediatedTests, BasicFederatedAuthRequestImplTest, ::testing::ValuesIn(kMediatedTestCases), @@ -925,9 +708,9 @@ AuthRequestTestCase test_case = GetParam(); CreateAuthRequest(GURL(test_case.inputs.provider)); SetMockExpectations(test_case); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(auth_response.first, test_case.expected.return_status); EXPECT_EQ(auth_response.second, test_case.expected.token); } @@ -936,9 +719,9 @@ AuthRequestTestCase test_case = GetParam(); CreateAuthRequest(GURL(test_case.inputs.provider)); SetMockExpectations(test_case); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(main_test_rfh()->GetFederatedAuthRequestIssueCount( test_case.expected.devtools_issue_status), auth_response.first == RequestIdTokenStatus::kSuccess ? 0 : 1); @@ -1033,53 +816,44 @@ static const AuthRequestTestCase kSuccessfulMediatedSignUpTestCase{ "Successful mediated flow with one account", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, - kNotPreferAutoSignIn}, + {kIdpTestOrigin, kClientId, kNonce, kNotPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, kToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kSuccess, kAccounts, FetchStatus::kSuccess}}}; static const AuthRequestTestCase kFailedMediatedSignUpTestCase{ "Failed mediated flow with one account", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, - kNotPreferAutoSignIn}, + {kIdpTestOrigin, kClientId, kNonce, kNotPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, kToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kSuccess, kAccounts, FetchStatus::kInvalidResponseError}}}; static const AuthRequestTestCase kSuccessfulMediatedAutoSignInTestCase{ "Successful mediated flow with one account", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, - kPreferAutoSignIn}, + {kIdpTestOrigin, kClientId, kNonce, kPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, kToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kSuccess, kAccounts, FetchStatus::kSuccess}}}; TEST_F(BasicFederatedAuthRequestImplTest, @@ -1087,9 +861,9 @@ const auto& test_case = kSuccessfulMediatedSignUpTestCase; CreateAuthRequest(GURL(test_case.inputs.provider)); SetMockExpectations(test_case); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(LoginState::kSignUp, displayed_accounts()[0].login_state); } @@ -1114,9 +888,9 @@ url::Origin::Create(GURL(kIdpTestOrigin)), _, "1234")) .WillOnce(Return(true)); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(LoginState::kSignIn, displayed_accounts()[0].login_state); } @@ -1141,9 +915,9 @@ url::Origin::Create(GURL(kIdpTestOrigin)), _, "1234")) .Times(1); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); } TEST_F(BasicFederatedAuthRequestImplTest, @@ -1163,9 +937,9 @@ GrantSharingPermissionForAccount(_, _, _)) .Times(0); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); } TEST_F(BasicFederatedAuthRequestImplTest, AutoSignInForReturningUser) { @@ -1194,11 +968,9 @@ .WillOnce(Return(true)); EXPECT_CALL(*mock_dialog_controller(), - ShowAccountsDialog(_, _, _, _, _, _, _, _)) + ShowAccountsDialog(_, _, _, _, _, _, _)) .WillOnce(Invoke( - [&](content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, + [&](content::WebContents* rp_web_contents, const GURL& idp_signin_url, base::span<const content::IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, const ClientIdData& client_id_data, SignInMode sign_in_mode, @@ -1210,9 +982,9 @@ })); EXPECT_EQ(test_case.config.Mediated_conf.accounts.size(), 1u); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); ASSERT_FALSE(displayed_accounts.empty()); EXPECT_EQ(displayed_accounts[0].login_state, LoginState::kSignIn); @@ -1229,11 +1001,9 @@ const auto& test_case = kSuccessfulMediatedAutoSignInTestCase; CreateAuthRequest(GURL(test_case.inputs.provider)); EXPECT_CALL(*mock_dialog_controller(), - ShowAccountsDialog(_, _, _, _, _, _, _, _)) + ShowAccountsDialog(_, _, _, _, _, _, _)) .WillOnce(Invoke( - [&](content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, + [&](content::WebContents* rp_web_contents, const GURL& idp_signin_url, base::span<const content::IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, const ClientIdData& client_id_data, SignInMode sign_in_mode, @@ -1245,9 +1015,9 @@ })); SetMockExpectations(test_case); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); ASSERT_FALSE(displayed_accounts.empty()); EXPECT_EQ(displayed_accounts[0].login_state, LoginState::kSignUp); @@ -1283,11 +1053,9 @@ .WillOnce(Return(true)); EXPECT_CALL(*mock_dialog_controller(), - ShowAccountsDialog(_, _, _, _, _, _, _, _)) + ShowAccountsDialog(_, _, _, _, _, _, _)) .WillOnce(Invoke( - [&](content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, + [&](content::WebContents* rp_web_contents, const GURL& idp_signin_url, base::span<const content::IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, const ClientIdData& client_id_data, SignInMode sign_in_mode, @@ -1300,9 +1068,9 @@ })); EXPECT_EQ(test_case.config.Mediated_conf.accounts.size(), 1u); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); ASSERT_FALSE(displayed_accounts.empty()); EXPECT_EQ(displayed_accounts[0].login_state, LoginState::kSignIn); @@ -1404,9 +1172,9 @@ ukm_recorder()->SetOnAddEntryCallback(Entry::kEntryName, ukm_loop.QuitClosure()); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(auth_response.second.value(), kToken); ukm_loop.Run(); @@ -1452,9 +1220,9 @@ ukm_recorder()->SetOnAddEntryCallback(Entry::kEntryName, ukm_loop.QuitClosure()); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(LoginState::kSignIn, displayed_accounts()[0].login_state); ukm_loop.Run(); @@ -1487,19 +1255,16 @@ AccountList displayed_accounts; const AuthRequestTestCase test_case = { "Failed mediated flow due to user not selecting an account", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, - kNotPreferAutoSignIn}, + {kIdpTestOrigin, kClientId, kNonce, kNotPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, kToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kSuccess, kAccounts, absl::nullopt, /*customized_dialog=*/true}}}; auto& auth_request = CreateAuthRequest(GURL(test_case.inputs.provider)); @@ -1510,11 +1275,9 @@ &mock_sharing_permission_delegate); EXPECT_CALL(*mock_dialog_controller(), - ShowAccountsDialog(_, _, _, _, _, _, _, _)) + ShowAccountsDialog(_, _, _, _, _, _, _)) .WillOnce(Invoke( - [&](content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, + [&](content::WebContents* rp_web_contents, const GURL& idp_signin_url, base::span<const content::IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, const ClientIdData& client_id_data, SignInMode sign_in_mode, @@ -1531,9 +1294,9 @@ ukm_recorder()->SetOnAddEntryCallback(Entry::kEntryName, ukm_loop.QuitClosure()); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); ukm_loop.Run(); @@ -1582,9 +1345,9 @@ url::Origin::Create(GURL(kIdpTestOrigin)), _, "1234")) .WillOnce(Return(true)); - auto auth_response = PerformAuthRequest( - test_case.inputs.client_id, test_case.inputs.nonce, test_case.inputs.mode, - test_case.inputs.prefer_auto_sign_in); + auto auth_response = + PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, + test_case.inputs.prefer_auto_sign_in); EXPECT_EQ(LoginState::kSignIn, displayed_accounts()[0].login_state); histogram_tester.ExpectBucketCount("Blink.FedCm.WebContentsVisible", 1, 1); @@ -1600,19 +1363,16 @@ const AuthRequestTestCase test_case = { "Failed mediated flow due to user leaving the page", - {kIdpTestOrigin, kClientId, kNonce, RequestMode::kMediated, - kNotPreferAutoSignIn}, + {kIdpTestOrigin, kClientId, kNonce, kNotPreferAutoSignIn}, {RequestIdTokenStatus::kSuccess, FederatedAuthRequestResult::kSuccess, kToken}, {kToken, - absl::nullopt, FetchStatus::kSuccess, kSuccessfulClientId, "", kAccountsEndpoint, kTokenEndpoint, kClientMetadataEndpoint, - kPermissionNoop, {FetchStatus::kSuccess, kAccounts, absl::nullopt, /*customized_dialog=*/true}}}; CreateAuthRequest(GURL(test_case.inputs.provider)); @@ -1623,7 +1383,6 @@ ASSERT_NE(web_contents_impl->GetVisibility(), Visibility::VISIBLE); PerformAuthRequest(test_case.inputs.client_id, test_case.inputs.nonce, - test_case.inputs.mode, test_case.inputs.prefer_auto_sign_in); histogram_tester.ExpectBucketCount("Blink.FedCm.WebContentsVisible", 0, 1);
diff --git a/content/browser/webid/federated_auth_request_service.cc b/content/browser/webid/federated_auth_request_service.cc index 818d3abe..3aeafe8 100644 --- a/content/browser/webid/federated_auth_request_service.cc +++ b/content/browser/webid/federated_auth_request_service.cc
@@ -50,10 +50,9 @@ const GURL& provider, const std::string& client_id, const std::string& nonce, - blink::mojom::RequestMode mode, bool prefer_auto_sign_in, RequestIdTokenCallback callback) { - impl_->RequestIdToken(provider, client_id, nonce, mode, prefer_auto_sign_in, + impl_->RequestIdToken(provider, client_id, nonce, prefer_auto_sign_in, std::move(callback)); }
diff --git a/content/browser/webid/federated_auth_request_service.h b/content/browser/webid/federated_auth_request_service.h index b971cd51..e3b7e7e 100644 --- a/content/browser/webid/federated_auth_request_service.h +++ b/content/browser/webid/federated_auth_request_service.h
@@ -46,7 +46,6 @@ void RequestIdToken(const GURL& provider, const std::string& client_id, const std::string& nonce, - blink::mojom::RequestMode mode, bool prefer_auto_sign_in, RequestIdTokenCallback) override; void CancelTokenRequest() override;
diff --git a/content/browser/webid/id_token_request_callback_data.cc b/content/browser/webid/id_token_request_callback_data.cc deleted file mode 100644 index 04f85cb9..0000000 --- a/content/browser/webid/id_token_request_callback_data.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/webid/id_token_request_callback_data.h" - -#include "content/public/browser/web_contents.h" - -namespace content { - -constexpr char kIdTokenRequestCallbackKey[] = "kIdTokenRequestCallbackKey"; - -IdTokenRequestCallbackData::IdTokenRequestCallbackData(DoneCallback callback) - : callback_(std::move(callback)) {} -IdTokenRequestCallbackData::~IdTokenRequestCallbackData() = default; - -DoneCallback IdTokenRequestCallbackData::TakeDoneCallback() { - return std::move(callback_); -} - -// static -void IdTokenRequestCallbackData::Set(WebContents* web_contents, - DoneCallback callback) { - web_contents->SetUserData( - kIdTokenRequestCallbackKey, - std::make_unique<IdTokenRequestCallbackData>(std::move(callback))); -} - -// static -IdTokenRequestCallbackData* IdTokenRequestCallbackData::Get( - WebContents* web_contents) { - return static_cast<IdTokenRequestCallbackData*>( - web_contents->GetUserData(kIdTokenRequestCallbackKey)); -} - -// static -void IdTokenRequestCallbackData::Remove(WebContents* web_contents) { - web_contents->RemoveUserData(kIdTokenRequestCallbackKey); -} - -} // namespace content \ No newline at end of file
diff --git a/content/browser/webid/id_token_request_callback_data.h b/content/browser/webid/id_token_request_callback_data.h deleted file mode 100644 index a70b8e811..0000000 --- a/content/browser/webid/id_token_request_callback_data.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_WEBID_ID_TOKEN_REQUEST_CALLBACK_DATA_H_ -#define CONTENT_BROWSER_WEBID_ID_TOKEN_REQUEST_CALLBACK_DATA_H_ - -#include <memory> -#include <string> - -#include "base/callback.h" -#include "base/supports_user_data.h" -#include "content/common/content_export.h" - -namespace content { - -class WebContents; - -using DoneCallback = base::OnceCallback<void(const std::string&)>; - -// This class holds on to the needed WebID callbacks to help connect the IDP -// `navigator.id.provide()` response to the appropriate RP `navigator.id.get()` -// request. -// -// Note that the |web_contents| instance that is passed in must be that of the -// IDP sign-in page. An important assumption here is that this WebContents -// instance is used only for a single `navigator.id.get()` call. Otherwise the -// simple mechanism to use UserData would lead to callbacks from different WebID -// consumers overriding each leading to hard-to-detect breakage. Currently this -// assumption is valid since we create a new IDP sign-in window for each request -// and don't try to re-use them. -class CONTENT_EXPORT IdTokenRequestCallbackData - : public base::SupportsUserData::Data { - public: - explicit IdTokenRequestCallbackData(DoneCallback callback); - ~IdTokenRequestCallbackData() override; - - DoneCallback TakeDoneCallback(); - - static void Set(WebContents* web_contents, DoneCallback callback); - static IdTokenRequestCallbackData* Get(WebContents* web_contents); - static void Remove(WebContents* web_contents); - - private: - DoneCallback callback_; -}; - -} // namespace content -#endif // CONTENT_BROWSER_WEBID_ID_TOKEN_REQUEST_CALLBACK_DATA_H_ \ No newline at end of file
diff --git a/content/browser/webid/test/fake_identity_request_dialog_controller.cc b/content/browser/webid/test/fake_identity_request_dialog_controller.cc index 6c50b5d..c66f78bc 100644 --- a/content/browser/webid/test/fake_identity_request_dialog_controller.cc +++ b/content/browser/webid/test/fake_identity_request_dialog_controller.cc
@@ -5,60 +5,29 @@ #include "content/browser/webid/test/fake_identity_request_dialog_controller.h" #include "base/bind.h" -#include "content/browser/webid/id_token_request_callback_data.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { FakeIdentityRequestDialogController::FakeIdentityRequestDialogController( - absl::optional<UserApproval> initial_permission_response, - absl::optional<UserApproval> token_exchange_permission_response, - std::string id_token) - : initial_permission_response_(initial_permission_response), - token_exchange_permission_response_(token_exchange_permission_response), - id_token_(id_token) {} + absl::optional<std::string> dialog_selected_account) + : dialog_selected_account_(dialog_selected_account) {} FakeIdentityRequestDialogController::~FakeIdentityRequestDialogController() = default; -void FakeIdentityRequestDialogController::ShowInitialPermissionDialog( - WebContents*, - const GURL&, - PermissionDialogMode mode, - InitialApprovalCallback callback) { - if (initial_permission_response_) - std::move(callback).Run(*initial_permission_response_); -} - -void FakeIdentityRequestDialogController::ShowIdProviderWindow( - WebContents*, - WebContents* idp_web_contents, - const GURL&, - IdProviderWindowClosedCallback callback) { - close_idp_window_callback_ = std::move(callback); - auto* request_callback_data = - IdTokenRequestCallbackData::Get(idp_web_contents); - EXPECT_TRUE(request_callback_data); - - // TODO(kenrb, majidvp): This is faking the IdP response which in reality - // comes from the navigator.id.provide() API call. We should instead load - // the IdP page in the new WebContents and that API's behavior. - auto rp_done_callback = request_callback_data->TakeDoneCallback(); - IdTokenRequestCallbackData::Remove(idp_web_contents); - EXPECT_TRUE(rp_done_callback); - std::move(rp_done_callback).Run(id_token_); -} - -void FakeIdentityRequestDialogController::CloseIdProviderWindow() { - std::move(close_idp_window_callback_).Run(); -} - -void FakeIdentityRequestDialogController::ShowTokenExchangePermissionDialog( - content::WebContents*, - const GURL&, - TokenExchangeApprovalCallback callback) { - if (token_exchange_permission_response_) - std::move(callback).Run(*token_exchange_permission_response_); +void FakeIdentityRequestDialogController::ShowAccountsDialog( + WebContents* rp_web_contents, + const GURL& idp_signin_url, + base::span<const IdentityRequestAccount> accounts, + const IdentityProviderMetadata& idp_metadata, + const ClientIdData& client_id_data, + IdentityRequestAccount::SignInMode sign_in_mode, + AccountSelectionCallback on_selected) { + if (dialog_selected_account_) { + std::move(on_selected) + .Run(*dialog_selected_account_, true /* is_sign_in */); + } } } // namespace content
diff --git a/content/browser/webid/test/fake_identity_request_dialog_controller.h b/content/browser/webid/test/fake_identity_request_dialog_controller.h index 178c3558..342b9b4 100644 --- a/content/browser/webid/test/fake_identity_request_dialog_controller.h +++ b/content/browser/webid/test/fake_identity_request_dialog_controller.h
@@ -23,10 +23,8 @@ class FakeIdentityRequestDialogController : public IdentityRequestDialogController { public: - FakeIdentityRequestDialogController( - absl::optional<UserApproval> initial_permission_response, - absl::optional<UserApproval> token_exchange_permission_response, - std::string id_token); + explicit FakeIdentityRequestDialogController( + absl::optional<std::string> dialog_selected_account); ~FakeIdentityRequestDialogController() override; FakeIdentityRequestDialogController( @@ -34,32 +32,16 @@ FakeIdentityRequestDialogController& operator=( const FakeIdentityRequestDialogController&) = delete; - void ShowInitialPermissionDialog(WebContents*, - const GURL&, - PermissionDialogMode mode, - InitialApprovalCallback callback) override; - void ShowIdProviderWindow(WebContents*, - WebContents* idp_web_contents, - const GURL&, - IdProviderWindowClosedCallback callback) override; - void CloseIdProviderWindow() override; - void ShowTokenExchangePermissionDialog( - WebContents*, - const GURL&, - TokenExchangeApprovalCallback callback) override; + void ShowAccountsDialog(WebContents* rp_web_contents, + const GURL& idp_signin_url, + base::span<const IdentityRequestAccount> accounts, + const IdentityProviderMetadata& idp_metadata, + const ClientIdData& client_id_data, + IdentityRequestAccount::SignInMode sign_in_mode, + AccountSelectionCallback on_selected) override; private: - // User action on the initial IdP tracking permission prompt. nullopt - // prevents the callback from being invoked. - absl::optional<UserApproval> initial_permission_response_; - - // User action on the token exchange permission prompt. nullopt - // prevents the callback from being invoked. - absl::optional<UserApproval> token_exchange_permission_response_; - - std::string id_token_; - - base::OnceClosure close_idp_window_callback_; + absl::optional<std::string> dialog_selected_account_; }; } // namespace content
diff --git a/content/browser/webid/test/mock_identity_request_dialog_controller.h b/content/browser/webid/test/mock_identity_request_dialog_controller.h index 627f55d..64d1322e 100644 --- a/content/browser/webid/test/mock_identity_request_dialog_controller.h +++ b/content/browser/webid/test/mock_identity_request_dialog_controller.h
@@ -24,25 +24,9 @@ MockIdentityRequestDialogController& operator=( const MockIdentityRequestDialogController&) = delete; - MOCK_METHOD4(ShowInitialPermissionDialog, + MOCK_METHOD7(ShowAccountsDialog, void(WebContents*, const GURL&, - PermissionDialogMode, - InitialApprovalCallback)); - MOCK_METHOD4(ShowIdProviderWindow, - void(WebContents*, - WebContents*, - const GURL&, - IdProviderWindowClosedCallback)); - MOCK_METHOD0(CloseIdProviderWindow, void()); - MOCK_METHOD3(ShowTokenExchangePermissionDialog, - void(content::WebContents*, - const GURL&, - TokenExchangeApprovalCallback)); - MOCK_METHOD8(ShowAccountsDialog, - void(WebContents*, - WebContents*, - const GURL&, base::span<const content::IdentityRequestAccount> accounts, const IdentityProviderMetadata&, const ClientIdData&,
diff --git a/content/browser/webid/webid_browsertest.cc b/content/browser/webid/webid_browsertest.cc index 4978e2b8..a7acee4 100644 --- a/content/browser/webid/webid_browsertest.cc +++ b/content/browser/webid/webid_browsertest.cc
@@ -47,25 +47,22 @@ constexpr char kRpHostName[] = "rp.example"; constexpr char kIdpOrigin[] = "https://idp.example.org"; constexpr char kExpectedManifestPath[] = "/fedcm.json"; -constexpr char kIdpEndpointRelativeValue[] = "/fedcm/sign-in"; -constexpr char kTestManifestResponseBody[] = - "{\"idp_endpoint\": \"/fedcm/sign-in\"}"; -constexpr char kTestIdpEndpointBody[] = "{\"signin_url\": \"/fedcm/\"}"; constexpr char kTestContentType[] = "application/json"; constexpr char kIdpForbiddenHeader[] = "Sec-FedCM-CSRF"; -// Value will be added here as token introspection is implemented. + +// Id token value in //content/test/data/id_token_endpoint.json constexpr char kIdToken[] = "[not a real token]"; -constexpr char kIdpEndpointTokenResponse[] = - "{\"id_token\": \"[not a real token]\"}"; // This class implements the IdP logic, and responds to requests sent to the // test HTTP server. class IdpTestServer { public: - struct ResponseDetails { + struct ManifestDetails { HttpStatusCode status_code; - std::string body; std::string content_type; + std::string accounts_endpoint_url; + std::string client_metadata_endpoint_url; + std::string id_token_endpoint_url; }; IdpTestServer() = default; @@ -86,26 +83,17 @@ auto response = std::make_unique<BasicHttpResponse>(); if (IsManifestRequest(request)) { - BuildResponseFromDetails(*response.get(), manifest_details_); - return response; - } - - if (IsIdpEndpointRequest(request)) { - BuildResponseFromDetails(*response.get(), idp_endpoint_details_); + BuildManifestResponseFromDetails(*response.get(), manifest_details_); return response; } return nullptr; } - void SetManifestResponseDetails(ResponseDetails details) { + void SetManifestResponseDetails(ManifestDetails details) { manifest_details_ = details; } - void SetIdpEndpointResponseDetails(ResponseDetails details) { - idp_endpoint_details_ = details; - } - private: bool IsManifestRequest(const HttpRequest& request) { if (request.method == HttpMethod::METHOD_GET && @@ -115,33 +103,34 @@ return false; } - bool IsIdpEndpointRequest(const HttpRequest& request) { - if (request.method == HttpMethod::METHOD_GET && - request.relative_url.rfind(kIdpEndpointRelativeValue, 0) == 0 && - request.all_headers.find(kIdpForbiddenHeader) != std::string::npos) { - return true; - } - return false; - } - - void BuildResponseFromDetails(BasicHttpResponse& response, - const ResponseDetails& details) { + void BuildManifestResponseFromDetails(BasicHttpResponse& response, + const ManifestDetails& details) { + std::string content = ConvertToJsonDictionary( + {{"accounts_endpoint", details.accounts_endpoint_url}, + {"client_metadata_endpoint", details.client_metadata_endpoint_url}, + {"id_token_endpoint", details.id_token_endpoint_url}}); response.set_code(details.status_code); - response.set_content(details.body); + response.set_content(content); response.set_content_type(details.content_type); } - // Response values for the types of requests that are sent to the IdP. - // These have default values that can be overridden for specific tests. - ResponseDetails manifest_details_ = {net::HTTP_OK, kTestManifestResponseBody, - kTestContentType}; - ResponseDetails idp_endpoint_details_ = {net::HTTP_OK, kTestIdpEndpointBody, - kTestContentType}; + std::string ConvertToJsonDictionary( + const std::map<std::string, std::string>& data) { + std::string out = "{"; + for (auto it : data) { + out += "\"" + it.first + "\":\"" + it.second + "\","; + } + if (!out.empty()) { + out[out.length() - 1] = '}'; + } + return out; + } + + ManifestDetails manifest_details_; }; } // namespace -// TODO(yigu): Update the tests (e.g. fedcm manifest) to cover mediation mode. class WebIdBrowserTest : public ContentBrowserTest { public: WebIdBrowserTest() = default; @@ -164,9 +153,7 @@ shell(), https_server().GetURL(kRpHostName, "/title1.html"))); test_browser_client_ = std::make_unique<WebIdTestContentBrowserClient>(); - SetTestIdentityRequestDialogController( - IdentityRequestDialogController::UserApproval::kApproved, - IdentityRequestDialogController::UserApproval::kApproved); + SetTestIdentityRequestDialogController("not_real_account"); old_client_ = SetBrowserClientForTesting(test_browser_client_.get()); } @@ -206,8 +193,7 @@ BaseIdpUrl() + R"(', clientId: 'client_id_1', nonce: '12345', - }], - mode: "permission", + }] } })); return x; @@ -215,13 +201,21 @@ )"; } + IdpTestServer::ManifestDetails BuildValidManifestDetails() { + std::string accounts_endpoint_url = "/fedcm/accounts_endpoint.json"; + std::string client_metadata_endpoint_url = + "/fedcm/client_metadata_endpoint.json"; + std::string id_token_endpoint_url = "/fedcm/id_token_endpoint.json"; + return {net::HTTP_OK, kTestContentType, accounts_endpoint_url, + client_metadata_endpoint_url, id_token_endpoint_url}; + } + IdpTestServer* idp_server() { return idp_server_.get(); } void SetTestIdentityRequestDialogController( - IdentityRequestDialogController::UserApproval initial_permission_response, - IdentityRequestDialogController::UserApproval token_exchange_response) { + const std::string& dialog_selected_account) { auto controller = std::make_unique<FakeIdentityRequestDialogController>( - initial_permission_response, token_exchange_response, kIdToken); + dialog_selected_account); test_browser_client_->SetIdentityRequestDialogController( std::move(controller)); } @@ -236,14 +230,7 @@ // Verify a standard login flow with IdP sign-in page. IN_PROC_BROWSER_TEST_F(WebIdBrowserTest, FullLoginFlow) { - EXPECT_EQ(std::string(kIdToken), EvalJs(shell(), GetBasicRequestString())); -} - -// Verify abbreviated login flow where IdP returns a token from the -// |idp_endpoint|. -IN_PROC_BROWSER_TEST_F(WebIdBrowserTest, FastLoginFlow) { - idp_server()->SetIdpEndpointResponseDetails( - {net::HTTP_OK, kIdpEndpointTokenResponse, kTestContentType}); + idp_server()->SetManifestResponseDetails(BuildValidManifestDetails()); EXPECT_EQ(std::string(kIdToken), EvalJs(shell(), GetBasicRequestString())); } @@ -251,53 +238,21 @@ // Verify full login flow where the IdP uses absolute rather than relative // URLs. IN_PROC_BROWSER_TEST_F(WebIdBrowserTest, AbsoluteURLs) { - std::string idp_endpoint_absolute_url = - BaseIdpUrl() + kIdpEndpointRelativeValue; - std::string manifest_response_body = - "{\"idp_endpoint\": \"" + idp_endpoint_absolute_url + "\"}"; - idp_server()->SetManifestResponseDetails( - {net::HTTP_OK, manifest_response_body, kTestContentType}); + IdpTestServer::ManifestDetails manifest_details = BuildValidManifestDetails(); + manifest_details.accounts_endpoint_url = "/fedcm/accounts_endpoint.json"; + manifest_details.client_metadata_endpoint_url = + "/fedcm/client_metadata_endpoint.json"; + manifest_details.id_token_endpoint_url = "/fedcm/id_token_endpoint.json"; - std::string signin_url_absolute_url = BaseIdpUrl() + "/fedcm"; - std::string idp_endpoint_response_body = - "{\"signin_url\": \"" + signin_url_absolute_url + "\"}"; - idp_server()->SetIdpEndpointResponseDetails( - {net::HTTP_OK, idp_endpoint_response_body, kTestContentType}); + idp_server()->SetManifestResponseDetails(manifest_details); EXPECT_EQ(std::string(kIdToken), EvalJs(shell(), GetBasicRequestString())); } -// Simulate the user declining the permission dialog to allow the request to -// proceed. -IN_PROC_BROWSER_TEST_F(WebIdBrowserTest, InitialPermissionDeclined) { - SetTestIdentityRequestDialogController( - IdentityRequestDialogController::UserApproval::kDenied, - IdentityRequestDialogController::UserApproval::kApproved); - - std::string expected_error = - "a JavaScript error: \"AbortError: User " - "declined the sign-in attempt.\"\n"; - EXPECT_EQ(expected_error, EvalJs(shell(), GetBasicRequestString()).error); -} - -// Simulate the user declining to share the ID token after it has been -// provided. -// TODO(kenrb): Add a variant of this test that denies approval when the token -// has been provided from the idp_endpoint. Currently the permission prompt does -// not get displayed in that case. -IN_PROC_BROWSER_TEST_F(WebIdBrowserTest, TokenExchangePermissionDeclined) { - SetTestIdentityRequestDialogController( - IdentityRequestDialogController::UserApproval::kApproved, - IdentityRequestDialogController::UserApproval::kDenied); - - std::string expected_error = - "a JavaScript error: \"AbortError: User " - "declined the sign-in attempt.\"\n"; - EXPECT_EQ(expected_error, EvalJs(shell(), GetBasicRequestString()).error); -} - -// Verify an attempt to invoke WebID with an insecure IDP path fails. +// Verify an attempt to invoke FedCM with an insecure IDP path fails. IN_PROC_BROWSER_TEST_F(WebIdBrowserTest, FailsOnHTTP) { + idp_server()->SetManifestResponseDetails(BuildValidManifestDetails()); + std::string script = R"( (async () => { var x = (await navigator.credentials.get({
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc index 224e003..100ea8fc 100644 --- a/content/browser/webui/shared_resources_data_source.cc +++ b/content/browser/webui/shared_resources_data_source.cc
@@ -63,10 +63,6 @@ const std::set<int> GetChromeosMojoResourceIds() { return std::set<int>{ IDR_BLUETOOTH_CONFIG_MOJOM_LITE_JS, - IDR_CELLULAR_SETUP_MOJOM_HTML, - IDR_CELLULAR_SETUP_MOJOM_LITE_JS, - IDR_ESIM_MANAGER_MOJOM_HTML, - IDR_ESIM_MANAGER_MOJOM_LITE_JS, IDR_IP_ADDRESS_MOJOM_HTML, IDR_IP_ADDRESS_MOJOM_LITE_JS, IDR_IP_ADDRESS_MOJOM_WEBUI_JS, @@ -86,6 +82,10 @@ const std::set<int> GetAshMojoResourceIds() { return std::set<int>{ + IDR_CELLULAR_SETUP_MOJOM_HTML, + IDR_CELLULAR_SETUP_MOJOM_LITE_JS, + IDR_ESIM_MANAGER_MOJOM_HTML, + IDR_ESIM_MANAGER_MOJOM_LITE_JS, IDR_MULTIDEVICE_DEVICE_SYNC_MOJOM_HTML, IDR_MULTIDEVICE_DEVICE_SYNC_MOJOM_LITE_JS, IDR_MULTIDEVICE_MULTIDEVICE_SETUP_MOJOM_HTML,
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index ace032d..afc0dc3 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -554,8 +554,10 @@ // Operation result when the renderer asks the browser to create a new window. enum CreateNewWindowStatus { - // Ignore creation of the new window. This can happen because creation is - // blocked or because the new window should have no opener relationship. + // Creation of the new window was blocked, e.g. because the source frame + // doesn't have user activation. + kBlocked, + // Ignore creation of the new window, e.g. because noopener is in effect. kIgnore, // Reuse the current window rather than creating a new window. kReuse,
diff --git a/content/public/browser/identity_request_dialog_controller.cc b/content/public/browser/identity_request_dialog_controller.cc index 525c636..b9ab0a5c 100644 --- a/content/public/browser/identity_request_dialog_controller.cc +++ b/content/public/browser/identity_request_dialog_controller.cc
@@ -58,17 +58,8 @@ return 0; } -void IdentityRequestDialogController::ShowInitialPermissionDialog( - WebContents* rp_web_contents, - const GURL& idp_url, - PermissionDialogMode mode, - InitialApprovalCallback approval_callback) { - std::move(approval_callback).Run(UserApproval::kDenied); -} - void IdentityRequestDialogController::ShowAccountsDialog( content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_signin_url, base::span<const IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, @@ -78,21 +69,4 @@ std::move(on_selected).Run(/*account_id=*/"", /*is_sign_in=*/false); } -void IdentityRequestDialogController::ShowIdProviderWindow( - content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, - IdProviderWindowClosedCallback on_closed) { - std::move(on_closed).Run(); -} - -void IdentityRequestDialogController::CloseIdProviderWindow() {} - -void IdentityRequestDialogController::ShowTokenExchangePermissionDialog( - content::WebContents* rp_web_contents, - const GURL& idp_url, - TokenExchangeApprovalCallback approval_callback) { - std::move(approval_callback).Run(UserApproval::kDenied); -} - } // namespace content
diff --git a/content/public/browser/identity_request_dialog_controller.h b/content/public/browser/identity_request_dialog_controller.h index 8073d55..fb9ae7f 100644 --- a/content/public/browser/identity_request_dialog_controller.h +++ b/content/public/browser/identity_request_dialog_controller.h
@@ -123,63 +123,17 @@ // icon is displayed in the accounts dialog. virtual int GetBrandIconMinimumSize(); - // Permission-oriented flow methods. - - // Shows the initial permission dialog to the user. - // - // - |rp_web_contents| is the RP web contents that has initiated the - // identity request. - // - |idp_url| is the IDP URL that gets displayed to the user. - // - |mode| determines whether the dialog should maintain state across - // multiple calls - // - |approval_callback| callback is called with appropriate status depending - // on whether user granted or denied the permission. - // - // 'IdentityRequestDialogController' is destroyed before - // |rp_web_contents|. - virtual void ShowInitialPermissionDialog( - WebContents* rp_web_contents, - const GURL& idp_url, - PermissionDialogMode mode, - InitialApprovalCallback approval_callback); - // Shows and accounts selections for the given IDP. The |on_selected| callback // is called with the selected account id or empty string otherwise. // |sign_in_mode| represents whether this is an auto sign in flow. virtual void ShowAccountsDialog( content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_signin_url, base::span<const IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata, const ClientIdData& client_id_data, IdentityRequestAccount::SignInMode sign_in_mode, AccountSelectionCallback on_selected); - - // Shows the identity provider sign-in page at the given URL using the - // |idp_web_contents| inside a modal window. The |on_closed| callback is - // called when the window is closed by user or programmatically as a result of - // invoking CloseIdProviderWindow(). - // - // 'IdentityRequestDialogController' is destroyed before either WebContents. - virtual void ShowIdProviderWindow(content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, - const GURL& idp_signin_url, - IdProviderWindowClosedCallback on_closed); - - // Closes the identity provider sign-in window if any. - virtual void CloseIdProviderWindow(); - - // Shows the secondary permission dialog to the user. - // - |rp_web_contents| is the RP web contents that has initiated the - // identity request. - // - |idp_url| is the IDP URL that gets displayed to the user. - // - |approval_callback| callback is called with appropriate status depending - // on whether user granted or denied the permission. - virtual void ShowTokenExchangePermissionDialog( - content::WebContents* rp_web_contents, - const GURL& idp_url, - TokenExchangeApprovalCallback approval_callback); }; } // namespace content
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn index 1a92f220..8316274 100644 --- a/content/public/common/BUILD.gn +++ b/content/public/common/BUILD.gn
@@ -117,8 +117,6 @@ "content_switch_dependent_feature_overrides.h", "content_switches.cc", "content_switches.h", - "custom_handlers/protocol_handler.cc", - "custom_handlers/protocol_handler.h", "drop_data.cc", "drop_data.h", "input_event_ack_state.h",
diff --git a/content/public/common/content_client.cc b/content/public/common/content_client.cc index f808ff0c..6288755 100644 --- a/content/public/common/content_client.cc +++ b/content/public/common/content_client.cc
@@ -127,9 +127,4 @@ scoped_refptr<base::SequencedTaskRunner> io_task_runner, mojo::BinderMap* binders) {} -std::u16string ContentClient::GetLocalizedProtocolName( - const std::string& protocol) { - return base::UTF8ToUTF16(protocol); -} - } // namespace content
diff --git a/content/public/common/content_client.h b/content/public/common/content_client.h index 9d5c8bf0..6c48183 100644 --- a/content/public/common/content_client.h +++ b/content/public/common/content_client.h
@@ -205,8 +205,6 @@ scoped_refptr<base::SequencedTaskRunner> io_task_runner, mojo::BinderMap* binders); - virtual std::u16string GetLocalizedProtocolName(const std::string&); - private: friend class ContentClientInitializer; // To set these pointers. friend class InternalTestInitializer;
diff --git a/content/renderer/java/gin_java_bridge_value_converter_unittest.cc b/content/renderer/java/gin_java_bridge_value_converter_unittest.cc index 6e6332da..15f386c 100644 --- a/content/renderer/java/gin_java_bridge_value_converter_unittest.cc +++ b/content/renderer/java/gin_java_bridge_value_converter_unittest.cc
@@ -15,7 +15,6 @@ #include "v8/include/v8-array-buffer.h" #include "v8/include/v8-context.h" #include "v8/include/v8-isolate.h" -#include "v8/include/v8-locker.h" #include "v8/include/v8-microtask-queue.h" #include "v8/include/v8-persistent-handle.h" #include "v8/include/v8-primitive.h" @@ -32,7 +31,6 @@ protected: void SetUp() override { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate_); context_.Reset(isolate_, v8::Context::New(isolate_, NULL, global)); @@ -47,7 +45,6 @@ }; TEST_F(GinJavaBridgeValueConverterTest, BasicValues) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -84,7 +81,6 @@ } TEST_F(GinJavaBridgeValueConverterTest, ArrayBuffer) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -106,7 +102,6 @@ } TEST_F(GinJavaBridgeValueConverterTest, TypedArrays) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_);
diff --git a/content/renderer/pepper/video_encoder_shim.cc b/content/renderer/pepper/video_encoder_shim.cc index e5a7969..158ceaf 100644 --- a/content/renderer/pepper/video_encoder_shim.cc +++ b/content/renderer/pepper/video_encoder_shim.cc
@@ -186,7 +186,7 @@ config_.g_lag_in_frames = 0; config_.g_timebase.num = 1; config_.g_timebase.den = base::Time::kMicrosecondsPerSecond; - config_.rc_target_bitrate = config.bitrate.target() / 1000; + config_.rc_target_bitrate = config.bitrate.target_bps() / 1000; config_.rc_min_quantizer = min_quantizer; config_.rc_max_quantizer = max_quantizer; // Do not saturate CPU utilization just for encoding. On a lower-end system @@ -197,7 +197,7 @@ // Use Q/CQ mode if no target bitrate is given. Note that in the VP8/CQ case // the meaning of rc_target_bitrate changes to target maximum rate. - if (config.bitrate.target() == 0) { + if (config.bitrate.target_bps() == 0) { if (config.output_profile == media::VP9PROFILE_PROFILE0) { config_.rc_end_usage = VPX_Q; } else if (config.output_profile == media::VP8PROFILE_ANY) { @@ -264,7 +264,7 @@ } framerate_ = framerate; - uint32_t bitrate_kbit = bitrate.target() / 1000; + uint32_t bitrate_kbit = bitrate.target_bps() / 1000; if (config_.rc_target_bitrate == bitrate_kbit) return;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 8351788..9bdeb87 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -306,8 +306,27 @@ mojom::CreateNewWindowStatus status; mojom::CreateNewWindowReplyPtr reply; auto* frame_host = creator_frame->GetFrameHost(); - bool err = !frame_host->CreateNewWindow(std::move(params), &status, &reply); - if (err || status == mojom::CreateNewWindowStatus::kIgnore) + if (!frame_host->CreateNewWindow(std::move(params), &status, &reply)) { + // The sync IPC failed, e.g. maybe the render process is in the middle of + // shutting down. Can't create a new window without the browser process, + // so just bail out. + return nullptr; + } + + // If creation of the window was blocked (e.g. because this frame doesn't + // have user activation), return before consuming user activation. A frame + // that isn't allowed to open a window shouldn't be able to consume the + // activation for the rest of the frame tree. + if (status == mojom::CreateNewWindowStatus::kBlocked) + return nullptr; + + // Consume the transient user activation in the current renderer. + consumed_user_gesture = creator->ConsumeTransientUserActivation( + blink::UserActivationUpdateSource::kBrowser); + + // If we should ignore the new window (e.g. because of `noopener`), return + // now that user activation was consumed. + if (status == mojom::CreateNewWindowStatus::kIgnore) return nullptr; // For Android WebView, we support a pop-up like behavior for window.open() @@ -327,11 +346,6 @@ DCHECK_NE(MSG_ROUTING_NONE, reply->main_frame_route_id); DCHECK_NE(MSG_ROUTING_NONE, reply->widget_params->routing_id); - // The browser allowed creation of a new window and consumed the user - // activation. - consumed_user_gesture = creator->ConsumeTransientUserActivation( - blink::UserActivationUpdateSource::kBrowser); - // While this view may be a background extension page, it can spawn a visible // render view. So we just assume that the new one is not another background // page instead of passing on our own value.
diff --git a/content/renderer/v8_value_converter_impl_unittest.cc b/content/renderer/v8_value_converter_impl_unittest.cc index a662f8c..f9a2d49 100644 --- a/content/renderer/v8_value_converter_impl_unittest.cc +++ b/content/renderer/v8_value_converter_impl_unittest.cc
@@ -22,7 +22,6 @@ #include "v8/include/v8-date.h" #include "v8/include/v8-isolate.h" #include "v8/include/v8-local-handle.h" -#include "v8/include/v8-locker.h" #include "v8/include/v8-microtask-queue.h" #include "v8/include/v8-object.h" #include "v8/include/v8-persistent-handle.h" @@ -78,7 +77,6 @@ protected: void SetUp() override { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate_); context_.Reset(isolate_, v8::Context::New(isolate_, nullptr, global)); @@ -292,7 +290,6 @@ " \"empty-list\": [], \n" "}"); - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -414,7 +411,6 @@ std::unique_ptr<base::Value> original = base::test::ParseJsonDeprecated("{ \"foo.bar\": \"baz\" }"); - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -428,7 +424,6 @@ } TEST_F(V8ValueConverterImplTest, ObjectExceptions) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -473,7 +468,6 @@ } TEST_F(V8ValueConverterImplTest, ArrayExceptions) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -516,7 +510,6 @@ } TEST_F(V8ValueConverterImplTest, WeirdTypes) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -549,7 +542,6 @@ } TEST_F(V8ValueConverterImplTest, Prototype) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -575,7 +567,6 @@ std::unique_ptr<base::Value> original = base::test::ParseJsonDeprecated("{ \"foo\": \"good value\" }"); - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -644,7 +635,6 @@ std::unique_ptr<base::Value> original = base::test::ParseJsonDeprecated("[100, 200, 300]"); - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -710,7 +700,6 @@ } TEST_F(V8ValueConverterImplTest, StripNullFromObjects) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -734,7 +723,6 @@ } TEST_F(V8ValueConverterImplTest, RecursiveObjects) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -780,7 +768,6 @@ } TEST_F(V8ValueConverterImplTest, WeirdProperties) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -818,7 +805,6 @@ } TEST_F(V8ValueConverterImplTest, ArrayGetters) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -842,7 +828,6 @@ } TEST_F(V8ValueConverterImplTest, UndefinedValueBehavior) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -894,7 +879,6 @@ } TEST_F(V8ValueConverterImplTest, ObjectsWithClashingIdentityHash) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -931,7 +915,6 @@ } TEST_F(V8ValueConverterImplTest, DetectCycles) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -981,7 +964,6 @@ // Tests that reused object values with no cycles do not get nullified. TEST_F(V8ValueConverterImplTest, ReuseObjects) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -1043,7 +1025,6 @@ } TEST_F(V8ValueConverterImplTest, MaxRecursionDepth) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -1090,7 +1071,6 @@ } TEST_F(V8ValueConverterImplTest, NegativeZero) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -1160,7 +1140,6 @@ }; TEST_F(V8ValueConverterImplTest, StrategyOverrides) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_); @@ -1238,7 +1217,6 @@ // Verify that having a strategy that fallbacks to default behaviour // actually preserves it. TEST_F(V8ValueConverterImplTest, StrategyBypass) { - v8::Locker locked(isolate_); v8::HandleScope handle_scope(isolate_); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate_, context_);
diff --git a/content/services/auction_worklet/auction_v8_devtools_session.cc b/content/services/auction_worklet/auction_v8_devtools_session.cc index 4a5e8b87..45d959f 100644 --- a/content/services/auction_worklet/auction_v8_devtools_session.cc +++ b/content/services/auction_worklet/auction_v8_devtools_session.cc
@@ -187,7 +187,6 @@ AuctionV8DevToolsSession::~AuctionV8DevToolsSession() { DCHECK_CALLED_ON_VALID_SEQUENCE(v8_sequence_checker_); std::move(on_delete_callback_).Run(this); - v8::Locker locker(v8_helper_->isolate()); v8_session_.reset(); } @@ -238,7 +237,7 @@ v8_inspector::StringView( reinterpret_cast<const uint8_t*>(method.data()), method.size()))) { - // Need v8 locker, isolate access. + // Need v8 isolate access. AuctionV8Helper::FullIsolateScope v8_scope(v8_helper_); v8_session_->dispatchProtocolMessage(cbor_message);
diff --git a/content/services/auction_worklet/auction_v8_helper.cc b/content/services/auction_worklet/auction_v8_helper.cc index ad77afc2..5e140381 100644 --- a/content/services/auction_worklet/auction_v8_helper.cc +++ b/content/services/auction_worklet/auction_v8_helper.cc
@@ -246,8 +246,7 @@ base::Milliseconds(50); AuctionV8Helper::FullIsolateScope::FullIsolateScope(AuctionV8Helper* v8_helper) - : locker_(v8_helper->isolate()), - isolate_scope_(v8_helper->isolate()), + : isolate_scope_(v8_helper->isolate()), handle_scope_(v8_helper->isolate()) {} AuctionV8Helper::FullIsolateScope::~FullIsolateScope() = default; @@ -701,7 +700,7 @@ // Now the initialization is completed, create an isolate. isolate_holder_ = std::make_unique<gin::IsolateHolder>( - base::ThreadTaskRunnerHandle::Get(), gin::IsolateHolder::kUseLocker, + base::ThreadTaskRunnerHandle::Get(), gin::IsolateHolder::kSingleThread, gin::IsolateHolder::IsolateType::kUtility); FullIsolateScope v8_scope(this); scratch_context_.Reset(isolate(), CreateContext());
diff --git a/content/services/auction_worklet/auction_v8_helper.h b/content/services/auction_worklet/auction_v8_helper.h index 49e4896..e299eb4f 100644 --- a/content/services/auction_worklet/auction_v8_helper.h +++ b/content/services/auction_worklet/auction_v8_helper.h
@@ -28,7 +28,6 @@ #include "url/gurl.h" #include "v8/include/v8-forward.h" #include "v8/include/v8-isolate.h" -#include "v8/include/v8-locker.h" #include "v8/include/v8-persistent-handle.h" namespace v8 { @@ -74,7 +73,6 @@ ~FullIsolateScope(); private: - const v8::Locker locker_; const v8::Isolate::Scope isolate_scope_; const v8::HandleScope handle_scope_; };
diff --git a/content/services/auction_worklet/bidder_worklet.cc b/content/services/auction_worklet/bidder_worklet.cc index 4569692..6e549aa8 100644 --- a/content/services/auction_worklet/bidder_worklet.cc +++ b/content/services/auction_worklet/bidder_worklet.cc
@@ -596,6 +596,20 @@ return; } + if (browser_signal_top_level_seller_origin) { + bool allow_component_auction; + if (!result_dict.Get("allowComponentAuction", &allow_component_auction) || + !allow_component_auction) { + errors_out.push_back(base::StrCat( + {script_source_url_.spec(), + " generateBid() return value does not have allowComponentAuction " + "set to true. Bid dropped from component auction."})); + PostErrorBidCallbackToUserThread(std::move(callback), + std::move(errors_out)); + return; + } + } + if (bid <= 0 || std::isnan(bid) || !std::isfinite(bid)) { PostErrorBidCallbackToUserThread(std::move(callback), std::move(errors_out));
diff --git a/content/services/auction_worklet/bidder_worklet_unittest.cc b/content/services/auction_worklet/bidder_worklet_unittest.cc index cc29c244..58398d98 100644 --- a/content/services/auction_worklet/bidder_worklet_unittest.cc +++ b/content/services/auction_worklet/bidder_worklet_unittest.cc
@@ -288,7 +288,7 @@ const absl::optional<GURL>& expected_report_url, const std::vector<std::string>& expected_errors = std::vector<std::string>()) { - auto bidder_worklet = CreateWorkletAndGenerateBid(); + auto bidder_worklet = CreateWorklet(); ASSERT_TRUE(bidder_worklet); base::RunLoop run_loop; @@ -474,6 +474,7 @@ absl::optional<url::Origin> browser_signal_top_level_seller_origin_; std::string seller_signals_; + // Used for both the output GenerateBid(), and the input of ReportWin(). absl::optional<uint32_t> data_version_; GURL browser_signal_render_url_; double browser_signal_bid_; @@ -1605,10 +1606,13 @@ /*ad_components=*/absl::nullopt, base::TimeDelta())); + // Need to set `allowComponentAuction` to true for a bid to be created when + // topLevelSeller is non-null. browser_signal_top_level_seller_origin_ = url::Origin::Create(GURL("https://foo.test")); RunGenerateBidWithReturnValueExpectingResult( - R"({ad: browserSignals.topLevelSeller, bid:1, render:"https://response.test/"})", + R"({ad: browserSignals.topLevelSeller, bid:1, render:"https://response.test/", + allowComponentAuction: true})", mojom::BidderWorkletBid::New( R"("https://foo.test")", 1, GURL("https://response.test/"), /*ad_components=*/absl::nullopt, base::TimeDelta())); @@ -1731,6 +1735,73 @@ base::TimeDelta())); } +// Test behavior of the `allowComponentAuction` output field, which can block +// bids when not set to true and `topLevelSellerOrigin` is non-null. +TEST_F(BidderWorkletTest, GenerateBidAllowComponentAuction) { + // In all success cases, this is the returned bid. + const auto kBidOnSuccess = mojom::BidderWorkletBid::New( + "null", 1, GURL("https://response.test/"), + /*ad_components=*/absl::nullopt, base::TimeDelta()); + + // Use a null `topLevelSellerOrigin`. `allowComponentAuction` value should be + // ignored. + browser_signal_top_level_seller_origin_ = absl::nullopt; + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: true})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: false})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/"})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: 0})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: 1})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: "OnTuesdays"})", + kBidOnSuccess.Clone()); + + // Use a non-null `topLevelSellerOrigin`. `allowComponentAuction` value must + // be "true" for a bid to be generated. This uses the standard Javascript + // behavior for how to convert non-bools to a bool. + browser_signal_top_level_seller_origin_ = + url::Origin::Create(GURL("https://foo.test")); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: true})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: false})", + mojom::BidderWorkletBidPtr(), + /*expected_data_version=*/absl::nullopt, /*expected_errors=*/ + {"https://url.test/ generateBid() return value does not have " + "allowComponentAuction set to true. Bid dropped from component " + "auction."}); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/"})", + mojom::BidderWorkletBidPtr(), + /*expected_data_version=*/absl::nullopt, /*expected_errors=*/ + {"https://url.test/ generateBid() return value does not have " + "allowComponentAuction set to true. Bid dropped from component " + "auction."}); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: 0})", + mojom::BidderWorkletBidPtr(), + /*expected_data_version=*/absl::nullopt, /*expected_errors=*/ + {"https://url.test/ generateBid() return value does not have " + "allowComponentAuction set to true. Bid dropped from component " + "auction."}); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: 1})", + kBidOnSuccess.Clone()); + RunGenerateBidWithReturnValueExpectingResult( + R"({ad: null, bid:1, render:"https://response.test/", allowComponentAuction: "OnTuesdays"})", + kBidOnSuccess.Clone()); +} + TEST_F(BidderWorkletTest, GenerateBidWasm404) { interest_group_wasm_url_ = GURL(kWasmUrl); // Have the WASM URL 404. @@ -2276,13 +2347,7 @@ } TEST_F(BidderWorkletTest, ReportWinDataVersion) { - interest_group_trusted_bidding_signals_url_ = GURL("https://signals.test/"); - interest_group_trusted_bidding_signals_keys_.emplace(); - interest_group_trusted_bidding_signals_keys_->push_back("key1"); - AddVersionedJsonResponse( - &url_loader_factory_, - GURL("https://signals.test/?hostname=top.window.test&keys=key1"), - R"({"key1":1})", 5u); + data_version_ = 5u; RunReportWinWithFunctionBodyExpectingResult( "sendReportTo('https://dataVersion/'+browserSignals.dataVersion)", GURL("https://dataVersion/5"));
diff --git a/content/services/auction_worklet/worklet_v8_debug_test_util.cc b/content/services/auction_worklet/worklet_v8_debug_test_util.cc index b90b49e..957d6a452 100644 --- a/content/services/auction_worklet/worklet_v8_debug_test_util.cc +++ b/content/services/auction_worklet/worklet_v8_debug_test_util.cc
@@ -22,7 +22,6 @@ #include "content/services/auction_worklet/auction_v8_helper.h" #include "content/services/auction_worklet/auction_v8_inspector_util.h" #include "v8/include/v8-inspector.h" -#include "v8/include/v8-locker.h" namespace auction_worklet { @@ -157,7 +156,7 @@ CHECK( v8_inspector::V8InspectorSession::canDispatchMethod(ToStringView(method))) << method << " " << payload; - // Need v8 locker, isolate access. + // Need isolate access. AuctionV8Helper::FullIsolateScope v8_scope(v8_helper_.get()); // Send over the JSON message; we don't deal with CBOR in this fixture. @@ -200,12 +199,7 @@ ScopedInspectorSupport::V8State::V8State() = default; ScopedInspectorSupport::V8State::~V8State() { - // Need lock before deleting the `inspector_sessions_`. - { - v8::Locker locker(v8_helper_->isolate()); - inspector_sessions_.clear(); - } - + inspector_sessions_.clear(); output_channels_.clear(); // Delete inspector after `inspector_sessions_`, before `inspector_client`_
diff --git a/content/shell/browser/shell_identity_dialog_controller.cc b/content/shell/browser/shell_identity_dialog_controller.cc index 20f3898..2727183 100644 --- a/content/shell/browser/shell_identity_dialog_controller.cc +++ b/content/shell/browser/shell_identity_dialog_controller.cc
@@ -8,7 +8,6 @@ void ShellIdentityDialogController::ShowAccountsDialog( content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_signin_url, base::span<const IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata,
diff --git a/content/shell/browser/shell_identity_dialog_controller.h b/content/shell/browser/shell_identity_dialog_controller.h index 13f0693..b7eec9c 100644 --- a/content/shell/browser/shell_identity_dialog_controller.h +++ b/content/shell/browser/shell_identity_dialog_controller.h
@@ -12,7 +12,6 @@ class ShellIdentityDialogController : public IdentityRequestDialogController { public: void ShowAccountsDialog(content::WebContents* rp_web_contents, - content::WebContents* idp_web_contents, const GURL& idp_signin_url, base::span<const IdentityRequestAccount> accounts, const IdentityProviderMetadata& idp_metadata,
diff --git a/content/test/attribution_simulator_input_parser.cc b/content/test/attribution_simulator_input_parser.cc index 1fe2099..7f0cb432 100644 --- a/content/test/attribution_simulator_input_parser.cc +++ b/content/test/attribution_simulator_input_parser.cc
@@ -16,6 +16,7 @@ #include "base/time/time.h" #include "base/values.h" #include "content/browser/attribution_reporting/attribution_aggregatable_sources.h" +#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/common_source_info.h" #include "content/browser/attribution_reporting/storable_source.h" @@ -130,13 +131,14 @@ if (has_error_) return; + // TODO(apaseltiner): Parse filter data from `cfg`. events_.emplace_back( StorableSource(CommonSourceInfo( source_event_id, std::move(source_origin), std::move(destination_origin), std::move(reporting_origin), source_time, CommonSourceInfo::GetExpiryTime(expiry, source_time, *source_type), - *source_type, priority, debug_key, + *source_type, priority, AttributionFilterData(), debug_key, AttributionAggregatableSources())), std::move(source)); }
diff --git a/content/test/data/attribution_reporting/databases/version_27.sql b/content/test/data/attribution_reporting/databases/version_27.sql index f9dd076..2416e6e7 100644 --- a/content/test/data/attribution_reporting/databases/version_27.sql +++ b/content/test/data/attribution_reporting/databases/version_27.sql
@@ -48,4 +48,6 @@ CREATE INDEX contribution_report_time_idx ON aggregatable_contributions(report_time); +INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8,9); + COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_26.sql b/content/test/data/attribution_reporting/databases/version_28.sql similarity index 93% rename from content/test/data/attribution_reporting/databases/version_26.sql rename to content/test/data/attribution_reporting/databases/version_28.sql index 3d4d698..e6f51a0 100644 --- a/content/test/data/attribution_reporting/databases/version_26.sql +++ b/content/test/data/attribution_reporting/databases/version_28.sql
@@ -2,7 +2,7 @@ BEGIN TRANSACTION; -CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL); +CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL,aggregatable_sources BLOB NOT NULL,filter_data BLOB NOT NULL); CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,external_report_id TEXT NOT NULL,debug_key INTEGER); @@ -17,8 +17,8 @@ CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); INSERT INTO meta VALUES('mmap_status','-1'); -INSERT INTO meta VALUES('version','26'); -INSERT INTO meta VALUES('last_compatible_version','26'); +INSERT INTO meta VALUES('version','28'); +INSERT INTO meta VALUES('last_compatible_version','28'); CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin); @@ -48,6 +48,4 @@ CREATE INDEX contribution_report_time_idx ON aggregatable_contributions(report_time); -INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8,9); - COMMIT;
diff --git a/content/test/data/attribution_reporting/simulator/basic.output.json b/content/test/data/attribution_reporting/simulator/basic.output.json index a28f593..1a71e61 100644 --- a/content/test/data/attribution_reporting/simulator/basic.output.json +++ b/content/test/data/attribution_reporting/simulator/basic.output.json
@@ -9,7 +9,7 @@ "trigger_data": "7" }, "report_time": 1643408373, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": false }
diff --git a/content/test/data/attribution_reporting/simulator/basic_iso8601.output.json b/content/test/data/attribution_reporting/simulator/basic_iso8601.output.json index c72b4a6..07bc823 100644 --- a/content/test/data/attribution_reporting/simulator/basic_iso8601.output.json +++ b/content/test/data/attribution_reporting/simulator/basic_iso8601.output.json
@@ -9,7 +9,7 @@ "trigger_data": "7" }, "report_time": "2022-01-28T22:19:33.000Z", - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": false }
diff --git a/content/test/data/attribution_reporting/simulator/no_delay.output.json b/content/test/data/attribution_reporting/simulator/no_delay.output.json index bfe25260..cd5708f3 100644 --- a/content/test/data/attribution_reporting/simulator/no_delay.output.json +++ b/content/test/data/attribution_reporting/simulator/no_delay.output.json
@@ -9,7 +9,7 @@ "trigger_data": "7" }, "report_time": 1643235574, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": false }
diff --git a/content/test/data/attribution_reporting/simulator/noise_seed.output.json b/content/test/data/attribution_reporting/simulator/noise_seed.output.json index c62243d9..ea2d500 100644 --- a/content/test/data/attribution_reporting/simulator/noise_seed.output.json +++ b/content/test/data/attribution_reporting/simulator/noise_seed.output.json
@@ -9,7 +9,7 @@ "trigger_data": "5" }, "report_time": 1643408373, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": true } @@ -23,7 +23,7 @@ "trigger_data": "1" }, "report_time": 1643408373, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": true } @@ -37,7 +37,7 @@ "trigger_data": "3" }, "report_time": 1645831173, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": true }
diff --git a/content/test/data/attribution_reporting/simulator/rejected_triggers.output.json b/content/test/data/attribution_reporting/simulator/rejected_triggers.output.json index eea1d4d6..0e82ad7 100644 --- a/content/test/data/attribution_reporting/simulator/rejected_triggers.output.json +++ b/content/test/data/attribution_reporting/simulator/rejected_triggers.output.json
@@ -45,7 +45,7 @@ "trigger_data": "2" }, "report_time": 1643408373, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": false } @@ -59,7 +59,7 @@ "trigger_data": "4" }, "report_time": 1643408373, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": false } @@ -73,7 +73,7 @@ "trigger_data": "5" }, "report_time": 1643408373, - "report_url": "https://r.test/.well-known/attribution-reporting/report-attribution", + "report_url": "https://r.test/.well-known/attribution-reporting/report-event-attribution", "test_info": { "randomized_trigger": false }
diff --git a/content/test/data/fedcm/accounts_endpoint.json b/content/test/data/fedcm/accounts_endpoint.json new file mode 100644 index 0000000..6b63185 --- /dev/null +++ b/content/test/data/fedcm/accounts_endpoint.json
@@ -0,0 +1,10 @@ +{ + "accounts" : [ + { + "id": "carl21334213", + "email": "elisa.beckeet@gmail.com", + "name":"Elisa Beckeet", + "given_name": "Elisa" + } + ] +}
diff --git a/content/test/data/fedcm/client_metadata_endpoint.json b/content/test/data/fedcm/client_metadata_endpoint.json new file mode 100644 index 0000000..20bfbde --- /dev/null +++ b/content/test/data/fedcm/client_metadata_endpoint.json
@@ -0,0 +1,4 @@ +{ + "privacy_policy_url": "https://example.com/privacy_policy.html", + "terms_of_service_url": "https://example.com/terms_of_service.html" +}
diff --git a/content/test/data/fedcm/id_token_endpoint.json b/content/test/data/fedcm/id_token_endpoint.json new file mode 100644 index 0000000..90faa169 --- /dev/null +++ b/content/test/data/fedcm/id_token_endpoint.json
@@ -0,0 +1,3 @@ +{ + "id_token": "[not a real token]" +}
diff --git a/content/test/data/interest_group/bidding_logic.js b/content/test/data/interest_group/bidding_logic.js index 1964cb1a..a8ddb23d 100644 --- a/content/test/data/interest_group/bidding_logic.js +++ b/content/test/data/interest_group/bidding_logic.js
@@ -7,7 +7,14 @@ function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { const ad = interestGroup.ads[0]; - let result = {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + + // `auctionSignals` controls whether or not component auctions are allowed. + let allowComponentAuction = + typeof auctionSignals === 'string' && + auctionSignals.includes('bidderAllowsComponentAuction'); + + let result = {'ad': ad, 'bid': 1, 'render': ad.renderUrl, + 'allowComponentAuction': allowComponentAuction}; if (interestGroup.adComponents && interestGroup.adComponents[0]) result.adComponents = [interestGroup.adComponents[0].renderUrl]; return result;
diff --git a/content/test/data/interest_group/component_auction_bidding_argument_validator.js b/content/test/data/interest_group/component_auction_bidding_argument_validator.js index b4e9db7..daeaea5 100644 --- a/content/test/data/interest_group/component_auction_bidding_argument_validator.js +++ b/content/test/data/interest_group/component_auction_bidding_argument_validator.js
@@ -17,7 +17,8 @@ 'ad': ad, 'bid': 2, 'render': ad.renderUrl, - 'adComponents': [interestGroup.adComponents[0].renderUrl] + 'adComponents': [interestGroup.adComponents[0].renderUrl], + 'allowComponentAuction': true, }; }
diff --git a/docs/windows_build_instructions.md b/docs/windows_build_instructions.md index 3d32f2a..91dd910 100644 --- a/docs/windows_build_instructions.md +++ b/docs/windows_build_instructions.md
@@ -66,7 +66,7 @@ ## Install `depot_tools` Download the [depot_tools bundle](https://storage.googleapis.com/chrome-infra/depot_tools.zip) -and extract it somewhere. +and extract it somewhere (eg: C:\src\depot_tools). *** note **Warning:** **DO NOT** use drag-n-drop or copy-n-paste extract from Explorer, @@ -76,7 +76,9 @@ *** Add depot_tools to the start of your PATH (must be ahead of any installs of -Python). Assuming you unzipped the bundle to C:\src\depot_tools, open: +Python. Note that environment variable names are case insensitive). + +Assuming you unzipped the bundle to C:\src\depot_tools, open: Control Panel → System and Security → System → Advanced system settings @@ -85,8 +87,11 @@ that might already have a copy of Python or Git). If you don't have Administrator access, you can add a user-level PATH -environment variable and put `C:\src\depot_tools` at the front, but -if your system PATH has a Python in it, you will be out of luck. +environment variable by opening: + +Control Panel → System and Security → System → Search for "Edit environment variables for your account" + +Add `C:\src\depot_tools` at the front. Note: If your system PATH has a Python in it, you will be out of luck. Also, add a DEPOT_TOOLS_WIN_TOOLCHAIN system variable in the same way, and set it to 0. This tells depot_tools to use your locally installed version of Visual
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 1570b68..d0b5a5d 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1694,6 +1694,7 @@ AUTOTESTPRIVATE_ADDLOGINEVENTFORTESTING = 1631, OS_DIAGNOSTICS_RUNDISKREADROUTINE = 1632, FILEMANAGERPRIVATE_MOUNTGUEST = 1633, + AUTOTESTPRIVATE_ISLACROSPRIMARYBROWSER = 1634, // Last entry: Add new entries above, then run: // tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn index 6c533183..ae2a93f 100644 --- a/fuchsia/engine/BUILD.gn +++ b/fuchsia/engine/BUILD.gn
@@ -667,6 +667,7 @@ "//fuchsia/engine/web_instance_host", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.policy", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.web", + "//third_party/fuchsia-sdk/sdk/pkg/fdio", "//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp", "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp", "//url",
diff --git a/fuchsia/engine/test/web_engine_shell.cc b/fuchsia/engine/test/web_engine_shell.cc index ad12deb..e05268f 100644 --- a/fuchsia/engine/test/web_engine_shell.cc +++ b/fuchsia/engine/test/web_engine_shell.cc
@@ -5,6 +5,7 @@ #include <fuchsia/sys/cpp/fidl.h> #include <fuchsia/ui/policy/cpp/fidl.h> #include <fuchsia/web/cpp/fidl.h> +#include <lib/fdio/directory.h> #include <lib/sys/cpp/component_context.h> #include <lib/ui/scenic/cpp/view_token_pair.h> #include <lib/vfs/cpp/pseudo_file.h> @@ -41,6 +42,7 @@ "enable-protected-media-identifier"; constexpr char kWebEnginePackageName[] = "web-engine-package-name"; constexpr char kUseWebInstance[] = "use-web-instance"; +constexpr char kEnableWebInstanceTmp[] = "enable-web-instance-tmp"; void PrintUsage() { std::cerr << "Usage: " @@ -147,6 +149,8 @@ const bool enable_protected_media_identifier_access = command_line->HasSwitch(kEnableProtectedMediaIdentifier); const bool use_context_provider = !command_line->HasSwitch(kUseWebInstance); + const bool enable_web_instance_tmp = + command_line->HasSwitch(kEnableWebInstanceTmp); base::CommandLine::StringVector additional_args = command_line->GetArgs(); GURL url(GetUrlFromArgs(additional_args)); @@ -155,6 +159,12 @@ return 1; } + if (enable_web_instance_tmp && use_context_provider) { + LOG(ERROR) << "Cannot use --enable-web-instance-tmp without " + << "--use-web-instance"; + return 1; + } + // Remove the url since we don't pass it into WebEngine additional_args.erase(additional_args.begin()); @@ -215,6 +225,7 @@ // Keep alive in run_loop scope. fuchsia::web::ContextProviderPtr web_context_provider; std::unique_ptr<cr_fuchsia::WebInstanceHost> web_instance_host; + fuchsia::io::DirectoryHandle tmp_directory; if (use_context_provider) { web_context_provider = ConnectToContextProvider( @@ -223,9 +234,18 @@ web_context_provider->Create(std::move(create_context_params), context.NewRequest()); } else { + web_instance_host = std::make_unique<cr_fuchsia::WebInstanceHost>(); + if (enable_web_instance_tmp) { + zx_status_t status = fdio_open( + "/tmp", + fuchsia::io::OPEN_RIGHT_READABLE | fuchsia::io::OPEN_RIGHT_WRITABLE | + fuchsia::io::OPEN_FLAG_DIRECTORY, + tmp_directory.NewRequest().TakeChannel().release()); + ZX_CHECK(status == ZX_OK, status) << "fdio_open(/tmp)"; + web_instance_host->set_tmp_dir(std::move(tmp_directory)); + } fidl::InterfaceRequest<fuchsia::io::Directory> services_request; auto services = sys::ServiceDirectory::CreateWithRequest(&services_request); - web_instance_host = std::make_unique<cr_fuchsia::WebInstanceHost>(); zx_status_t result = web_instance_host->CreateInstanceForContext( std::move(create_context_params), std::move(services_request)); if (result == ZX_OK) {
diff --git a/fuchsia/engine/test/web_engine_shell.cmx b/fuchsia/engine/test/web_engine_shell.cmx index aac26b21..7b303c6 100644 --- a/fuchsia/engine/test/web_engine_shell.cmx +++ b/fuchsia/engine/test/web_engine_shell.cmx
@@ -5,7 +5,8 @@ "sandbox": { "features": [ "deprecated-ambient-replace-as-executable", - "isolated-persistent-storage" + "isolated-persistent-storage", + "isolated-temp" ], "services": [ "fuchsia.accessibility.semantics.SemanticsManager",
diff --git a/fuchsia/engine/web_instance_host/web_instance_host.cc b/fuchsia/engine/web_instance_host/web_instance_host.cc index 9caa6e8..b28be2a 100644 --- a/fuchsia/engine/web_instance_host/web_instance_host.cc +++ b/fuchsia/engine/web_instance_host/web_instance_host.cc
@@ -803,6 +803,11 @@ ZX_CHECK(status == ZX_OK, status); } + if (tmp_dir_.is_valid()) { + launch_info.flat_namespace->paths.push_back("/tmp"); + launch_info.flat_namespace->directories.push_back(tmp_dir_.TakeChannel()); + } + // Pass on the caller's service-directory request. launch_info.directory_request = services_request.TakeChannel();
diff --git a/fuchsia/engine/web_instance_host/web_instance_host.h b/fuchsia/engine/web_instance_host/web_instance_host.h index c2b6bcb..096fa1e 100644 --- a/fuchsia/engine/web_instance_host/web_instance_host.h +++ b/fuchsia/engine/web_instance_host/web_instance_host.h
@@ -61,6 +61,13 @@ config_for_test_ = std::move(config); } + // The next created WebInstance will have access to the given directory handle + // for temporary directory reading and writing. + // Ownership of the directory is passed to the next created instance. + void set_tmp_dir(fuchsia::io::DirectoryHandle tmp_dir) { + tmp_dir_ = std::move(tmp_dir); + } + private: // Returns the Launcher for the isolated Environment in which web instances // should run. If the Environment does not presently exist then it will be @@ -74,6 +81,10 @@ // If true then new instances will have remote debug mode enabled. bool enable_remote_debug_mode_ = false; + // If set, then the next created WebInstance will gain ownership of this + // directory. + fuchsia::io::DirectoryHandle tmp_dir_; + // Set by configuration tests. base::Value config_for_test_; };
diff --git a/gpu/command_buffer/service/external_vk_image_factory_unittest.cc b/gpu/command_buffer/service/external_vk_image_factory_unittest.cc index ba63052..d38cf18 100644 --- a/gpu/command_buffer/service/external_vk_image_factory_unittest.cc +++ b/gpu/command_buffer/service/external_vk_image_factory_unittest.cc
@@ -294,7 +294,7 @@ std::vector<GrBackendSemaphore> begin_semaphores; std::vector<GrBackendSemaphore> end_semaphores; auto skia_scoped_access = skia_representation->BeginScopedWriteAccess( - 1 /* final_msaa_count */, + /*final_msaa_count=*/1, SkSurfaceProps(0 /* flags */, kUnknown_SkPixelGeometry), &begin_semaphores, &end_semaphores, gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes);
diff --git a/gpu/command_buffer/service/shared_image_representation.cc b/gpu/command_buffer/service/shared_image_representation.cc index 1ac37cd..7a582478 100644 --- a/gpu/command_buffer/service/shared_image_representation.cc +++ b/gpu/command_buffer/service/shared_image_representation.cc
@@ -179,7 +179,7 @@ AllowUnclearedAccess allow_uncleared, bool use_sk_surface) { return BeginScopedWriteAccess( - 0 /* final_msaa_count */, + /*final_msaa_count=*/1, SkSurfaceProps(0 /* flags */, kUnknown_SkPixelGeometry), begin_semaphores, end_semaphores, allow_uncleared, use_sk_surface); }
diff --git a/gpu/vulkan/generate_bindings.py b/gpu/vulkan/generate_bindings.py index cdacf74..d9ca37e 100755 --- a/gpu/vulkan/generate_bindings.py +++ b/gpu/vulkan/generate_bindings.py
@@ -74,6 +74,12 @@ ] }, { + 'extension': 'VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME', + 'functions': [ + 'vkCreateHeadlessSurfaceEXT', + ] + }, + { 'ifdef': 'defined(USE_VULKAN_XCB)', 'extension': 'VK_KHR_XCB_SURFACE_EXTENSION_NAME', 'functions': [
diff --git a/gpu/vulkan/vulkan_function_pointers.cc b/gpu/vulkan/vulkan_function_pointers.cc index 4f1a3e8b..2733bb32 100644 --- a/gpu/vulkan/vulkan_function_pointers.cc +++ b/gpu/vulkan/vulkan_function_pointers.cc
@@ -298,6 +298,18 @@ } } + if (gfx::HasExtension(enabled_extensions, + VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME)) { + vkCreateHeadlessSurfaceEXT = + reinterpret_cast<PFN_vkCreateHeadlessSurfaceEXT>( + vkGetInstanceProcAddr(vk_instance, "vkCreateHeadlessSurfaceEXT")); + if (!vkCreateHeadlessSurfaceEXT) { + DLOG(WARNING) << "Failed to bind vulkan entrypoint: " + << "vkCreateHeadlessSurfaceEXT"; + return false; + } + } + #if defined(USE_VULKAN_XCB) if (gfx::HasExtension(enabled_extensions, VK_KHR_XCB_SURFACE_EXTENSION_NAME)) {
diff --git a/gpu/vulkan/vulkan_function_pointers.h b/gpu/vulkan/vulkan_function_pointers.h index 9f687d5..8a824a2 100644 --- a/gpu/vulkan/vulkan_function_pointers.h +++ b/gpu/vulkan/vulkan_function_pointers.h
@@ -153,6 +153,8 @@ VulkanFunction<PFN_vkGetPhysicalDeviceSurfaceSupportKHR> vkGetPhysicalDeviceSurfaceSupportKHR; + VulkanFunction<PFN_vkCreateHeadlessSurfaceEXT> vkCreateHeadlessSurfaceEXT; + #if defined(USE_VULKAN_XCB) VulkanFunction<PFN_vkCreateXcbSurfaceKHR> vkCreateXcbSurfaceKHR; VulkanFunction<PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR> @@ -500,6 +502,15 @@ physicalDevice, queueFamilyIndex, surface, pSupported); } +ALWAYS_INLINE VkResult +vkCreateHeadlessSurfaceEXT(VkInstance instance, + const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface) { + return gpu::GetVulkanFunctionPointers()->vkCreateHeadlessSurfaceEXT( + instance, pCreateInfo, pAllocator, pSurface); +} + #if defined(USE_VULKAN_XCB) ALWAYS_INLINE VkResult vkCreateXcbSurfaceKHR(VkInstance instance,
diff --git "a/infra/config/generated/builders/ci/Win ASan Release \050reclient shadow\051/properties.json" "b/infra/config/generated/builders/ci/Win ASan Release \050reclient shadow\051/properties.json" new file mode 100644 index 0000000..b232002 --- /dev/null +++ "b/infra/config/generated/builders/ci/Win ASan Release \050reclient shadow\051/properties.json"
@@ -0,0 +1,16 @@ +{ + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics" + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win ASan Release Media \050reclient shadow\051/properties.json" "b/infra/config/generated/builders/ci/Win ASan Release Media \050reclient shadow\051/properties.json" new file mode 100644 index 0000000..b232002 --- /dev/null +++ "b/infra/config/generated/builders/ci/Win ASan Release Media \050reclient shadow\051/properties.json"
@@ -0,0 +1,16 @@ +{ + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics" + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 3d0126c3..86d66cc2 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -19396,6 +19396,85 @@ } } builders { + name: "Win ASan Release (reclient shadow)" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/Win ASan Release (reclient shadow)/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "Win ASan Release Media" swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:Win ASan Release Media" @@ -19474,6 +19553,85 @@ } } builders { + name: "Win ASan Release Media (reclient shadow)" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/Win ASan Release Media (reclient shadow)/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "Win Builder" swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:Win Builder"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 2610b937..bf56e432 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -6690,6 +6690,16 @@ category: "win" short_name: "re x" } + builders { + name: "buildbucket/luci.chromium.ci/Win ASan Release Media (reclient shadow)" + category: "win asan" + short_name: "med" + } + builders { + name: "buildbucket/luci.chromium.ci/Win ASan Release (reclient shadow)" + category: "win asan" + short_name: "rel" + } header { oncalls { name: "Chromium"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 3cee988..39826a8 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3439,6 +3439,16 @@ } } job { + id: "Win ASan Release (reclient shadow)" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "Win ASan Release (reclient shadow)" + } +} +job { id: "Win ASan Release Media" realm: "ci" acl_sets: "ci" @@ -3453,6 +3463,16 @@ } } job { + id: "Win ASan Release Media (reclient shadow)" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "Win ASan Release Media (reclient shadow)" + } +} +job { id: "Win Builder" realm: "ci" acl_sets: "ci" @@ -7145,7 +7165,9 @@ triggers: "WebKit Linux MSAN" triggers: "Win 10 Fast Ring" triggers: "Win ASan Release" + triggers: "Win ASan Release (reclient shadow)" triggers: "Win ASan Release Media" + triggers: "Win ASan Release Media (reclient shadow)" triggers: "Win Builder" triggers: "Win Builder (dbg)" triggers: "Win x64 Builder"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 51ce50c..a12f446a 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -704,6 +704,32 @@ # End - Reclient migration, phase 2, block 1 shadow builders ci.builder( + name = "Win ASan Release (reclient shadow)", + builderless = True, + console_view_entry = consoles.console_view_entry( + category = "win asan", + short_name = "rel", + ), + os = os.WINDOWS_DEFAULT, + goma_backend = None, + reclient_jobs = rbe_jobs.DEFAULT, + reclient_instance = rbe_instance.DEFAULT, +) + +ci.builder( + name = "Win ASan Release Media (reclient shadow)", + builderless = True, + console_view_entry = consoles.console_view_entry( + category = "win asan", + short_name = "med", + ), + os = os.WINDOWS_DEFAULT, + goma_backend = None, + reclient_jobs = rbe_jobs.DEFAULT, + reclient_instance = rbe_instance.DEFAULT, +) + +ci.builder( name = "Win x64 Builder (reclient)", builderless = True, console_view_entry = consoles.console_view_entry(
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 0620e68..7f8b6f3 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1668,7 +1668,7 @@ Microphone </message> <message name="IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION" desc="Description of the permissions infobar used to update site permissions."> - "<ph name="SITE_NAME">$1</ph>" permissions will reset to off when you leave this site. + <ph name="BEGIN_BOLD">BEGIN_BOLD</ph>"<ph name="SITE_NAME">$1</ph>"<ph name="END_BOLD">END_BOLD</ph> permissions will reset to off when you leave this site. </message> <message name="IDS_IOS_PERMISSIONS_INFOBAR_MODAL_TITLE" desc="Title of the permissions infobar used to update site permissions."> Access
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION.png.sha1 index b1f7964..11965f7 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION.png.sha1
@@ -1 +1 @@ -1d4a04097332b915e3155227a3e447507d422c56 \ No newline at end of file +3f01dc2a46297df1267ab643fe7b3af9200a9376 \ No newline at end of file
diff --git a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.h b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.h index ad423f23..52751c22 100644 --- a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.h +++ b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#include "base/scoped_observation.h" #include "base/timer/timer.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/infobars/core/infobar.h" @@ -43,6 +44,7 @@ // infobars::InfoBarManager::Observer implementation. void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override; + void OnManagerShuttingDown(infobars::InfoBarManager* manager) override; private: friend class web::WebStateUserData<PermissionsOverlayTabHelper>; @@ -70,6 +72,11 @@ // A mapping of current permissions to their states used to detect changes. NSMutableDictionary<NSNumber*, NSNumber*>* permissions_to_state_; + // Scoped observer that facilitates observing the infobar manager. + base::ScopedObservation<infobars::InfoBarManager, + infobars::InfoBarManager::Observer> + infobar_manager_scoped_observation_{this}; + // Banner queue for the TabHelper's WebState; OverlayRequestQueue* banner_queue_ = nullptr;
diff --git a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm index 73531ce..514120a 100644 --- a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm +++ b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm
@@ -99,13 +99,23 @@ void PermissionsOverlayTabHelper::OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) { if (infobar == infobar_) { + infobar_manager_scoped_observation_.Reset(); infobar_ = nullptr; } } +void PermissionsOverlayTabHelper::OnManagerShuttingDown( + infobars::InfoBarManager* manager) { + DCHECK(infobar_manager_scoped_observation_.IsObservingSource(manager)); + infobar_manager_scoped_observation_.Reset(); +} + void PermissionsOverlayTabHelper::ShowInfoBar() { infobars::InfoBarManager* infobar_manager = InfoBarManagerImpl::FromWebState(web_state_); + if (!infobar_manager_scoped_observation_.IsObservingSource(infobar_manager)) { + infobar_manager_scoped_observation_.Observe(infobar_manager); + } std::unique_ptr<PermissionsOverlayInfobarDelegate> delegate( std::make_unique<PermissionsOverlayInfobarDelegate>(
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/permissions/permissions_modal_overlay_request_config.mm b/ios/chrome/browser/overlays/public/infobar_modal/permissions/permissions_modal_overlay_request_config.mm index 4abde35..936eeed 100644 --- a/ios/chrome/browser/overlays/public/infobar_modal/permissions/permissions_modal_overlay_request_config.mm +++ b/ios/chrome/browser/overlays/public/infobar_modal/permissions/permissions_modal_overlay_request_config.mm
@@ -33,7 +33,6 @@ web_state_->GetNavigationManager()->GetVisibleItem(); const GURL& URL = visible_item->GetURL(); - // TODO(crbug.com/1289645): Bold the host part. permissions_description_ = l10n_util::GetNSStringF(IDS_IOS_PERMISSIONS_INFOBAR_MODAL_DESCRIPTION, base::UTF8ToUTF16(URL.host()));
diff --git a/ios/chrome/browser/ui/activity_services/BUILD.gn b/ios/chrome/browser/ui/activity_services/BUILD.gn index c09454f..66c10814 100644 --- a/ios/chrome/browser/ui/activity_services/BUILD.gn +++ b/ios/chrome/browser/ui/activity_services/BUILD.gn
@@ -42,6 +42,7 @@ "//ios/chrome/browser/ui/main:scene_state_header", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/ui/util:url_with_title", + "//ios/chrome/browser/web", "//ios/chrome/browser/web_state_list", "//ui/base", "//url",
diff --git a/ios/chrome/browser/ui/activity_services/activities/BUILD.gn b/ios/chrome/browser/ui/activity_services/activities/BUILD.gn index 6f74ceb..a9289b2c 100644 --- a/ios/chrome/browser/ui/activity_services/activities/BUILD.gn +++ b/ios/chrome/browser/ui/activity_services/activities/BUILD.gn
@@ -44,6 +44,7 @@ "//ios/chrome/browser/ui/activity_services/requirements", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/util", + "//ios/chrome/browser/web", "//ios/web/common:user_agent", "//ios/web/public", "//ui/base", @@ -72,12 +73,17 @@ "//components/bookmarks/common", "//components/prefs:test_support", "//ios/chrome/app/strings", + "//ios/chrome/browser/browser_state:test_support", + "//ios/chrome/browser/main:public", + "//ios/chrome/browser/main:test_support", "//ios/chrome/browser/policy:feature_flags", "//ios/chrome/browser/ui/activity_services/data", "//ios/chrome/browser/ui/bookmarks:test_support", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/ui/util:url_with_title", + "//ios/chrome/browser/web", + "//ios/chrome/browser/web_state_list", "//ios/web/public/test", "//testing/gtest", "//third_party/ocmock",
diff --git a/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.h b/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.h index 81861cc8..d02e5b0 100644 --- a/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.h +++ b/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.h
@@ -10,6 +10,7 @@ #include "ios/web/common/user_agent.h" @protocol BrowserCommands; +class WebNavigationBrowserAgent; // Activity to request the Desktop or Mobile version of the page. @interface RequestDesktopOrMobileSiteActivity : UIActivity @@ -18,6 +19,7 @@ // with the current |userAgent| and |handler| to execute the action. - (instancetype)initWithUserAgent:(web::UserAgentType)userAgent handler:(id<BrowserCommands>)handler + navigationAgent:(WebNavigationBrowserAgent*)agent NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.mm b/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.mm index 9532eaa4..ba74fb3 100644 --- a/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.mm +++ b/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.mm
@@ -7,6 +7,7 @@ #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" +#import "ios/chrome/browser/web/web_navigation_browser_agent.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -25,19 +26,23 @@ // User agent type of the current page. @property(nonatomic, assign) web::UserAgentType userAgent; -// The handler that is invoked when the activity is performed. +// The handler that is invoked when the IPH bubble is displayed. @property(nonatomic, weak) id<BrowserCommands> handler; +// The agent that is invoked when the activity is performed. +@property(nonatomic, readonly) WebNavigationBrowserAgent* agent; @end @implementation RequestDesktopOrMobileSiteActivity - (instancetype)initWithUserAgent:(web::UserAgentType)userAgent - handler:(id<BrowserCommands>)handler { + handler:(id<BrowserCommands>)handler + navigationAgent:(WebNavigationBrowserAgent*)agent { self = [super init]; if (self) { _userAgent = userAgent; _handler = handler; + _agent = agent; } return self; } @@ -73,11 +78,12 @@ if (self.userAgent == web::UserAgentType::MOBILE) { base::RecordAction( base::UserMetricsAction("MobileShareActionRequestDesktop")); - [self.handler requestDesktopSite]; + self.agent->RequestDesktopSite(); + [self.handler showDefaultSiteViewIPH]; } else { base::RecordAction( base::UserMetricsAction("MobileShareActionRequestMobile")); - [self.handler requestMobileSite]; + self.agent->RequestMobileSite(); } }
diff --git a/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity_unittest.mm b/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity_unittest.mm index b3079bdc..852a416 100644 --- a/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity_unittest.mm +++ b/ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity_unittest.mm
@@ -4,8 +4,16 @@ #import "ios/chrome/browser/ui/activity_services/activities/request_desktop_or_mobile_site_activity.h" +#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#import "ios/chrome/browser/main/test_browser.h" #include "ios/chrome/browser/ui/commands/browser_commands.h" +#import "ios/chrome/browser/web/web_navigation_browser_agent.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" +#import "ios/chrome/browser/web_state_list/web_state_opener.h" #include "ios/chrome/grit/ios_strings.h" +#import "ios/web/public/test/fakes/fake_navigation_manager.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#import "ios/web/public/test/web_task_environment.h" #include "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" #include "third_party/ocmock/gtest_support.h" @@ -19,7 +27,20 @@ // Test fixture for covering the RequestDesktopOrMobileSiteActivity class. class RequestDesktopOrMobileSiteActivityTest : public PlatformTest { protected: - RequestDesktopOrMobileSiteActivityTest() {} + RequestDesktopOrMobileSiteActivityTest() { + browser_state_ = TestChromeBrowserState::Builder().Build(); + browser_ = std::make_unique<TestBrowser>(browser_state_.get()); + WebNavigationBrowserAgent::CreateForBrowser(browser_.get()); + agent_ = WebNavigationBrowserAgent::FromBrowser(browser_.get()); + WebStateOpener opener; + auto web_state = std::make_unique<web::FakeWebState>(); + auto navigation_manager = std::make_unique<web::FakeNavigationManager>(); + navigation_manager_ = navigation_manager.get(); + web_state->SetNavigationManager(std::move(navigation_manager)); + browser_->GetWebStateList()->InsertWebState( + 0, std::move(web_state), WebStateList::InsertionFlags::INSERT_ACTIVATE, + opener); + } void SetUp() override { PlatformTest::SetUp(); @@ -32,10 +53,18 @@ web::UserAgentType user_agent) { return [[RequestDesktopOrMobileSiteActivity alloc] initWithUserAgent:user_agent - handler:mocked_handler_]; + handler:mocked_handler_ + navigationAgent:agent_]; } id mocked_handler_; + web::WebTaskEnvironment task_environment_; + std::unique_ptr<TestChromeBrowserState> browser_state_; + std::unique_ptr<TestBrowser> browser_; + WebNavigationBrowserAgent* agent_; + // Navigation manager for the web state at index 0 in |browser_|'s web state + // list. + web::FakeNavigationManager* navigation_manager_; }; // Tests that the activity cannot be performed when the user agent is NONE. @@ -48,8 +77,6 @@ // Tests that the activity is enabled, has the right title and triggers the // right action when the user agent is Desktop. TEST_F(RequestDesktopOrMobileSiteActivityTest, UserAgentDesktop) { - [[mocked_handler_ expect] requestMobileSite]; - RequestDesktopOrMobileSiteActivity* activity = CreateActivity(web::UserAgentType::DESKTOP); @@ -66,12 +93,13 @@ [mocked_handler_ verify]; [activity_partial_mock verify]; + EXPECT_TRUE(navigation_manager_->RequestMobileSiteWasCalled()); } // Tests that the activity is enabled, has the right title and triggers the // right action when the user agent is Mobile. TEST_F(RequestDesktopOrMobileSiteActivityTest, UserAgentMobile) { - [[mocked_handler_ expect] requestDesktopSite]; + [[mocked_handler_ expect] showDefaultSiteViewIPH]; RequestDesktopOrMobileSiteActivity* activity = CreateActivity(web::UserAgentType::MOBILE); @@ -89,4 +117,5 @@ [mocked_handler_ verify]; [activity_partial_mock verify]; + EXPECT_TRUE(navigation_manager_->RequestDesktopSiteWasCalled()); }
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_coordinator.mm b/ios/chrome/browser/ui/activity_services/activity_service_coordinator.mm index c7969b2..75be1cab 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_coordinator.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_coordinator.mm
@@ -25,6 +25,7 @@ #import "ios/chrome/browser/ui/main/default_browser_scene_agent.h" #import "ios/chrome/browser/ui/main/scene_state_browser_agent.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/browser/web/web_navigation_browser_agent.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "net/base/mac/url_conversions.h" #include "url/gurl.h" @@ -70,13 +71,16 @@ ios::BookmarkModelFactory::GetForBrowserState(browserState); id<BookmarksCommands> bookmarksHandler = HandlerForProtocol( self.browser->GetCommandDispatcher(), BookmarksCommands); + WebNavigationBrowserAgent* agent = + WebNavigationBrowserAgent::FromBrowser(self.browser); self.mediator = [[ActivityServiceMediator alloc] initWithHandler:self.handler bookmarksHandler:bookmarksHandler qrGenerationHandler:self.scopedHandler prefService:browserState->GetPrefs() bookmarkModel:bookmarkModel - baseViewController:self.baseViewController]; + baseViewController:self.baseViewController + navigationAgent:agent]; SceneState* sceneState = SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState();
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_mediator.h b/ios/chrome/browser/ui/activity_services/activity_service_mediator.h index 69b7acc..e0c64932b 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_mediator.h +++ b/ios/chrome/browser/ui/activity_services/activity_service_mediator.h
@@ -25,6 +25,7 @@ @protocol QRGenerationCommands; @class ShareImageData; @class ShareToData; +class WebNavigationBrowserAgent; // Mediator used to generate activities. @interface ActivityServiceMediator : NSObject @@ -41,6 +42,7 @@ prefService:(PrefService*)prefService bookmarkModel:(bookmarks::BookmarkModel*)bookmarkModel baseViewController:(UIViewController*)baseViewController + navigationAgent:(WebNavigationBrowserAgent*)agent NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_mediator.mm b/ios/chrome/browser/ui/activity_services/activity_service_mediator.mm index c08b43ec9..f6b314e 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_mediator.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_mediator.mm
@@ -55,6 +55,9 @@ @property(nonatomic, weak) UIViewController* baseViewController; +// The navigation agent. +@property(nonatomic, readonly) WebNavigationBrowserAgent* navigationAgent; + @end @implementation ActivityServiceMediator @@ -66,7 +69,8 @@ qrGenerationHandler:(id<QRGenerationCommands>)qrGenerationHandler prefService:(PrefService*)prefService bookmarkModel:(bookmarks::BookmarkModel*)bookmarkModel - baseViewController:(UIViewController*)baseViewController { + baseViewController:(UIViewController*)baseViewController + navigationAgent:(WebNavigationBrowserAgent*)navigationAgent { if (self = [super init]) { _handler = handler; _bookmarksHandler = bookmarksHandler; @@ -74,6 +78,7 @@ _prefService = prefService; _bookmarkModel = bookmarkModel; _baseViewController = baseViewController; + _navigationAgent = navigationAgent; } return self; } @@ -147,7 +152,8 @@ RequestDesktopOrMobileSiteActivity* requestActivity = [[RequestDesktopOrMobileSiteActivity alloc] initWithUserAgent:data.userAgent - handler:self.handler]; + handler:self.handler + navigationAgent:self.navigationAgent]; [applicationActivities addObject:requestActivity]; }
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_mediator_unittest.mm b/ios/chrome/browser/ui/activity_services/activity_service_mediator_unittest.mm index 53c365b..d85f7910 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_mediator_unittest.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_mediator_unittest.mm
@@ -64,7 +64,8 @@ qrGenerationHandler:mocked_qr_generation_handler_ prefService:pref_service_.get() bookmarkModel:nil - baseViewController:nil]; + baseViewController:nil + navigationAgent:nil]; pref_service_->registry()->RegisterBooleanPref(prefs::kPrintingEnabled, true);
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 078a2f4..8233777 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -3890,23 +3890,6 @@ [self.sendTabToSelfCoordinator start]; } -// TODO(crbug.com/1272497): Move requestDesktopSite and requestMobileSite to the -// WebNavigationBrowserAgent. -- (void)requestDesktopSite { - [self reloadWithUserAgentType:web::UserAgentType::DESKTOP]; - - feature_engagement::TrackerFactory::GetForBrowserState(self.browserState) - ->NotifyEvent(feature_engagement::events::kDesktopVersionRequested); - - id<BrowserCommands> handler = - static_cast<id<BrowserCommands>>(self.commandDispatcher); - [handler showDefaultSiteViewIPH]; -} - -- (void)requestMobileSite { - [self reloadWithUserAgentType:web::UserAgentType::MOBILE]; -} - // TODO(crbug.com/1272498): Refactor this command away, and add a mediator to // observe the active web state closing and push updates into the BVC for UI // work. @@ -3989,19 +3972,6 @@ [self presentViewController:lensViewController animated:YES completion:nil]; } -#pragma mark - BrowserCommands helpers - -// Reloads the original url of the last non-redirect item (including non-history -// items) with |userAgentType|. -// TODO(crbug.com/1272497): Move this to the WebNavigationBrowserAgent. -- (void)reloadWithUserAgentType:(web::UserAgentType)userAgentType { - if (self.userAgentType == userAgentType) - return; - web::WebState* webState = self.currentWebState; - web::NavigationManager* navigationManager = webState->GetNavigationManager(); - navigationManager->ReloadWithUserAgentType(userAgentType); -} - #pragma mark - ChromeLensControllerDelegate // TODO(crbug.com/1272549): Move this delegate implmentation into // BrowserCoordinator, or into the dedicated lens coordinator.
diff --git a/ios/chrome/browser/ui/bubble/bubble_view.h b/ios/chrome/browser/ui/bubble/bubble_view.h index f02c1e0..a335465 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view.h +++ b/ios/chrome/browser/ui/bubble/bubble_view.h
@@ -7,6 +7,9 @@ #import <UIKit/UIKit.h> +// Accessibility identifier for the close button. +extern NSString* const kBubbleViewCloseButtonIdentifier; + // Direction for the bubble to point. typedef NS_ENUM(NSInteger, BubbleArrowDirection) { // Bubble is below the target UI element and the arrow is pointing up. @@ -25,6 +28,16 @@ BubbleAlignmentTrailing, }; +// Delegate for actions happening in BubbleView. +@protocol BubbleViewDelegate <NSObject> + +@optional + +// User tapped on the close button. +- (void)didTapCloseButton; + +@end + // Speech bubble shaped view that displays a message. @interface BubbleView : UIView @@ -41,6 +54,13 @@ - (instancetype)init NS_UNAVAILABLE; +// Controls if there is a close button in the view. Must be set before the view +// is added to a superview. +@property(nonatomic) BOOL showsCloseButton; + +// The delegate for interactions in this View. +@property(nonatomic, weak) id<BubbleViewDelegate> delegate; + @end #endif // IOS_CHROME_BROWSER_UI_BUBBLE_BUBBLE_VIEW_H_
diff --git a/ios/chrome/browser/ui/bubble/bubble_view.mm b/ios/chrome/browser/ui/bubble/bubble_view.mm index 48d90b32..e1601ca 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view.mm
@@ -10,6 +10,7 @@ #include "base/notreached.h" #import "ios/chrome/browser/ui/bubble/bubble_util.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" +#include "ios/chrome/browser/ui/util/rtl_geometry.h" #include "ios/chrome/browser/ui/util/ui_util.h" #include "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" @@ -18,6 +19,9 @@ #error "This file requires ARC support." #endif +// Accessibility identifier for the close button. +NSString* const kBubbleViewCloseButtonIdentifier = + @"BubbleViewCloseButtonIdentifier"; namespace { // The color of the bubble (both circular background and arrow). @@ -56,6 +60,12 @@ // Bezier curve constants. const CGFloat kControlPointCenter = 0.243125; const CGFloat kControlPointEnd = 0.514375; + +// The size of the close button. +const CGFloat kCloseButtonSize = 48.0f; +// The padding for the top and trailing edges of the close button. +const CGFloat kCloseButtonTopTrailingPadding = 15.0f; + } // namespace @interface BubbleView () @@ -65,6 +75,8 @@ @property(nonatomic, strong, readonly) UIView* background; // Triangular arrow that points to the target UI element. @property(nonatomic, strong, readonly) UIView* arrow; +// Optional close button displayed at the trailing top corner of the bubble. +@property(nonatomic, strong, readonly) UIButton* closeButton; // Triangular shape, the backing layer for the arrow. @property(nonatomic, weak) CAShapeLayer* arrowLayer; @property(nonatomic, assign, readonly) BubbleArrowDirection direction; @@ -80,6 +92,7 @@ @synthesize direction = _direction; @synthesize alignment = _alignment; @synthesize needsAddSubviews = _needsAddSubviews; +@synthesize closeButton = _closeButton; - (instancetype)initWithText:(NSString*)text arrowDirection:(BubbleArrowDirection)direction @@ -90,6 +103,7 @@ _alignment = alignment; _label = [BubbleView labelWithText:text]; _needsAddSubviews = YES; + _showsCloseButton = NO; } return self; } @@ -161,6 +175,58 @@ return _arrow; } +// Lazy loads the close button. +- (UIButton*)closeButton { + if (!_closeButton) { + UIImageSymbolConfiguration* configuration = [UIImageSymbolConfiguration + configurationWithScale:UIImageSymbolScaleMedium]; + UIImage* buttonImage = [UIImage systemImageNamed:@"xmark" + withConfiguration:configuration]; + // Computes the paddings to position the button's image. The button is + // bigger than the image for accessibility purposes. + const CGFloat closeButtonBottomPadding = kCloseButtonSize - + kCloseButtonTopTrailingPadding - + buttonImage.size.height; + const CGFloat closeButtonLeadingPadding = kCloseButtonSize - + kCloseButtonTopTrailingPadding - + buttonImage.size.width; + UIButton* button; + // setImageEdgeInsets from UIButton is deprecated since iOS 15.0, the new + // API uses UIButtonConfiguration to set the image inset. + if (@available(iOS 15.0, *)) { + UIButtonConfiguration* buttonConfiguration = + [UIButtonConfiguration.plainButtonConfiguration copy]; + [buttonConfiguration setImage:buttonImage]; + [buttonConfiguration + setContentInsets:NSDirectionalEdgeInsetsMake( + kCloseButtonTopTrailingPadding, + closeButtonLeadingPadding, + closeButtonBottomPadding, + kCloseButtonTopTrailingPadding)]; + button = [UIButton buttonWithConfiguration:buttonConfiguration + primaryAction:nil]; + } else { + button = [UIButton buttonWithType:UIButtonTypeSystem]; + [button setImage:buttonImage forState:UIControlStateNormal]; + [button.imageView setBounds:CGRectZero]; + [button.imageView setContentMode:UIViewContentModeScaleAspectFit]; + [button setImageEdgeInsets:UIEdgeInsetsMakeDirected( + kCloseButtonTopTrailingPadding, + closeButtonLeadingPadding, + closeButtonBottomPadding, + kCloseButtonTopTrailingPadding)]; + } + [button setTintColor:[UIColor colorNamed:kSolidButtonTextColor]]; + [button addTarget:self + action:@selector(closeButtonWasTapped:) + forControlEvents:UIControlEventTouchUpInside]; + [button setAccessibilityIdentifier:kBubbleViewCloseButtonIdentifier]; + [button setTranslatesAutoresizingMaskIntoConstraints:NO]; + _closeButton = button; + } + return _closeButton; +} + #pragma mark - Private class methods // Return a label to be used for a BubbleView that displays white text. @@ -179,6 +245,14 @@ #pragma mark - Private instance methods +// Handles taps on the close button. +- (void)closeButtonWasTapped:(UIButton*)button { + DCHECK(self.showsCloseButton); + if ([self.delegate respondsToSelector:@selector(didTapCloseButton)]) { + [self.delegate didTapCloseButton]; + } +} + // Add a drop shadow to the bubble. - (void)addShadow { [self.layer setShadowOffset:kShadowOffset]; @@ -196,39 +270,41 @@ [constraints addObject:[self arrowAlignmentConstraint]]; // Add constraints that depend on the bubble's direction. [constraints addObjectsFromArray:[self arrowDirectionConstraints]]; + // Add constraints for close button. + if (self.showsCloseButton) { + [constraints addObjectsFromArray:[self closeButtonConstraints]]; + } [NSLayoutConstraint activateConstraints:constraints]; } // Return an array of constraints that do not depend on the bubble's arrow // direction or alignment. - (NSArray<NSLayoutConstraint*>*)generalConstraints { + UIView* background = self.background; + UIView* label = self.label; NSArray<NSLayoutConstraint*>* constraints = @[ // Center the background view on the bubble view. - [self.background.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], - // Ensure that the background view is less wide than the bubble view, and - // add a margin to the sides of the background. - [self.background.widthAnchor - constraintLessThanOrEqualToAnchor:self.widthAnchor - constant:kBubbleMargin * 2], - // Ensure that the background view is as wide as the label, with added - // padding on the sides of the label. - [self.background.widthAnchor - constraintEqualToAnchor:self.label.widthAnchor - constant:kLabelHorizontalPadding * 2], - // Enforce the minimum width of the background view. - [self.background.widthAnchor + [background.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], + // Add a margin to the sides of the background. + [background.widthAnchor constraintEqualToAnchor:self.widthAnchor + constant:-kBubbleMargin * 2], + [background.widthAnchor constraintGreaterThanOrEqualToConstant:[self minBubbleWidth] - kBubbleMargin * 2], - // Ensure that the background view is as tall as the label, with added - // padding to the top and bottom of the label. - [self.background.heightAnchor - constraintEqualToAnchor:self.label.heightAnchor - constant:kLabelVerticalPadding * 2], - // Center the label on the background view. - [self.label.centerXAnchor - constraintEqualToAnchor:self.background.centerXAnchor], - [self.label.centerYAnchor - constraintEqualToAnchor:self.background.centerYAnchor], + // Ensure that the background view is as wide as the label, with added + // padding on the sides of the label. + [label.topAnchor + constraintGreaterThanOrEqualToAnchor:background.topAnchor + constant:kLabelVerticalPadding], + [background.bottomAnchor + constraintGreaterThanOrEqualToAnchor:label.bottomAnchor + constant:kLabelVerticalPadding], + [label.leadingAnchor + constraintGreaterThanOrEqualToAnchor:background.leadingAnchor + constant:kLabelHorizontalPadding], + [background.trailingAnchor + constraintGreaterThanOrEqualToAnchor:label.trailingAnchor + constant:kLabelHorizontalPadding], // Enforce the arrow's size, scaling by |kArrowScaleFactor| to prevent gaps // between the arrow and the background view. [self.arrow.widthAnchor constraintEqualToConstant:kArrowSize.width], @@ -238,6 +314,21 @@ return constraints; } +// Returns the constraint for the close button. +- (NSArray<NSLayoutConstraint*>*)closeButtonConstraints { + UIView* closeButton = self.closeButton; + NSArray<NSLayoutConstraint*>* constraints = @[ + [closeButton.widthAnchor constraintEqualToConstant:kCloseButtonSize], + [closeButton.heightAnchor constraintEqualToConstant:kCloseButtonSize], + [closeButton.leadingAnchor + constraintGreaterThanOrEqualToAnchor:self.label.trailingAnchor], + [closeButton.topAnchor constraintEqualToAnchor:self.background.topAnchor], + [closeButton.trailingAnchor + constraintEqualToAnchor:self.background.trailingAnchor], + ]; + return constraints; +} + // Return the constraint that aligns the arrow to the bubble view. This depends // on the bubble's alignment. - (NSLayoutConstraint*)arrowAlignmentConstraint { @@ -312,6 +403,9 @@ [self addSubview:self.arrow]; [self addSubview:self.background]; [self addSubview:self.label]; + if (self.showsCloseButton) { + [self addSubview:self.closeButton]; + } // Set |needsAddSubviews| to NO to ensure that the subviews are only added // to the view hierarchy once. self.needsAddSubviews = NO; @@ -332,7 +426,13 @@ - (CGSize)sizeThatFits:(CGSize)size { // The combined horizontal inset distance of the label with respect to the // bubble. - CGFloat labelHorizontalInset = (kBubbleMargin + kLabelHorizontalPadding) * 2; + CGFloat labelHorizontalInset = kBubbleMargin * 2 + kLabelHorizontalPadding; + // Add close button size, which is on the trailing edge of the labels. + if (self.showsCloseButton) { + labelHorizontalInset += MAX(kCloseButtonSize, kLabelHorizontalPadding); + } else { + labelHorizontalInset += kLabelHorizontalPadding; + } // The combined vertical inset distance of the label with respect to the // bubble. CGFloat labelVerticalInset =
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm index 60f9cb27..dc32f2ac 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/bubble/bubble_view.h" #include "base/ios/ios_util.h" +#include "base/mac/foundation_util.h" #include "ios/chrome/browser/ui/util/ui_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest_mac.h" @@ -14,6 +15,30 @@ #error "This file requires ARC support." #endif +@interface BubbleViewDelegateTest : NSObject <BubbleViewDelegate> + +- (instancetype)init; + +@property(nonatomic) int tapCounter; + +@end + +@implementation BubbleViewDelegateTest + +- (instancetype)init { + self = [super init]; + if (self) { + _tapCounter = 0; + } + return self; +} + +- (void)didTapCloseButton { + _tapCounter += 1; +} + +@end + // Fixture to test BubbleView. class BubbleViewTest : public PlatformTest { public: @@ -37,6 +62,16 @@ // Text that is longer than the maximum line width. It should wrap onto // multiple lines. NSString* longText_; + + UIButton* GetCloseButton(BubbleView* bubbleView) { + for (UIView* subview in bubbleView.subviews) { + if ([subview isKindOfClass:[UIButton class]] && + subview.accessibilityIdentifier == kBubbleViewCloseButtonIdentifier) { + return base::mac::ObjCCastStrict<UIButton>(subview); + } + } + return nil; + } }; // Test |sizeThatFits| given short text. @@ -74,3 +109,32 @@ [superview addSubview:bubble]; EXPECT_NSEQ(longText_, bubble.accessibilityLabel); } + +// Tests that the close button is not showed when the option is set to hidden. +TEST_F(BubbleViewTest, CloseButtonIsNotPresent) { + BubbleView* bubble = [[BubbleView alloc] initWithText:longText_ + arrowDirection:arrowDirection_ + alignment:alignment_]; + [bubble setShowsCloseButton:NO]; + UIView* superview = [[UIView alloc] initWithFrame:CGRectZero]; + [superview addSubview:bubble]; + UIButton* closeButton = GetCloseButton(bubble); + ASSERT_FALSE(closeButton); +} + +// Tests the close button action and its presence. +TEST_F(BubbleViewTest, CloseButtonActionAndPresent) { + BubbleView* bubble = [[BubbleView alloc] initWithText:longText_ + arrowDirection:arrowDirection_ + alignment:alignment_]; + BubbleViewDelegateTest* delegate = [[BubbleViewDelegateTest alloc] init]; + [bubble setShowsCloseButton:YES]; + [bubble setDelegate:delegate]; + UIView* superview = [[UIView alloc] initWithFrame:CGRectZero]; + [superview addSubview:bubble]; + UIButton* closeButton = GetCloseButton(bubble); + ASSERT_TRUE(closeButton); + // Tests close button action. + [closeButton sendActionsForControlEvents:UIControlEventTouchUpInside]; + EXPECT_EQ(delegate.tapCounter, 1); +}
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h index 264e0068..a2afe0f 100644 --- a/ios/chrome/browser/ui/commands/browser_commands.h +++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -74,14 +74,6 @@ // Shows the dialog for sending the current tab between a user's devices. - (void)showSendTabToSelfUI; -// Requests the "desktop" version of the current page in the active tab. -// TODO(crbug.com/1272497): Move requestDesktopSite and requestMobileSite to the -// WebNavigationBrowserAgent, eliminating them as commands. -- (void)requestDesktopSite; - -// Requests the "mobile" version of the current page in the active tab. -- (void)requestMobileSite; - // Prepares the browser to display a popup menu. - (void)prepareForPopupMenuPresentation:(PopupMenuCommandType)type;
diff --git a/ios/chrome/browser/ui/elements/BUILD.gn b/ios/chrome/browser/ui/elements/BUILD.gn index deaa9829..b204fed 100644 --- a/ios/chrome/browser/ui/elements/BUILD.gn +++ b/ios/chrome/browser/ui/elements/BUILD.gn
@@ -34,7 +34,6 @@ "windowed_container_view.mm", ] deps = [ - ":instruction_view_constants", "//base", "//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui/colors", @@ -64,14 +63,6 @@ ] } -source_set("instruction_view_constants") { - configs += [ "//build/config/compiler:enable_arc" ] - sources = [ - "instruction_view_constants.h", - "instruction_view_constants.mm", - ] -} - source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true
diff --git a/ios/chrome/browser/ui/elements/instruction_view.mm b/ios/chrome/browser/ui/elements/instruction_view.mm index 033566b..ef1a23e 100644 --- a/ios/chrome/browser/ui/elements/instruction_view.mm +++ b/ios/chrome/browser/ui/elements/instruction_view.mm
@@ -5,7 +5,6 @@ #import "ios/chrome/browser/ui/elements/instruction_view.h" #include "base/check.h" -#import "ios/chrome/browser/ui/elements/instruction_view_constants.h" #include "ios/chrome/common/string_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" @@ -139,7 +138,9 @@ instructionLabel.textColor = [UIColor colorNamed:kGrey800Color]; instructionLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; - instructionLabel.attributedText = [self putBoldPartInString:instruction]; + + instructionLabel.attributedText = + PutBoldPartInString(instruction, UIFontTextStyleSubheadline); instructionLabel.numberOfLines = 0; instructionLabel.adjustsFontForContentSizeCategory = YES; instructionLabel.translatesAutoresizingMaskIntoConstraints = NO; @@ -167,36 +168,6 @@ return line; } -// Parses a string with an embedded bold part inside, delineated by -// "BEGIN_BOLD" and "END_BOLD". Returns an attributed string with bold part. -- (NSAttributedString*)putBoldPartInString:(NSString*)string { - StringWithTag parsedString = - ParseStringWithTag(string, instruction_view::kInstructionViewBeginBoldTag, - instruction_view::kInstructionViewEndBoldTag); - - NSMutableAttributedString* attributedString = - [[NSMutableAttributedString alloc] initWithString:parsedString.string]; - - UIFontDescriptor* defaultDescriptor = [UIFontDescriptor - preferredFontDescriptorWithTextStyle:UIFontTextStyleSubheadline]; - - UIFontDescriptor* boldDescriptor = [[UIFontDescriptor - preferredFontDescriptorWithTextStyle:UIFontTextStyleSubheadline] - fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; - - [attributedString addAttribute:NSFontAttributeName - value:[UIFont fontWithDescriptor:defaultDescriptor - size:0.0] - range:NSMakeRange(0, parsedString.string.length)]; - - [attributedString addAttribute:NSFontAttributeName - value:[UIFont fontWithDescriptor:boldDescriptor - size:0.0] - range:parsedString.range]; - - return attributedString; -} - // Creates a view with a round numbered label in it. - (UIView*)createStepNumberView:(NSInteger)stepNumber { UILabel* stepNumberLabel = [[UILabel alloc] initWithFrame:CGRectZero];
diff --git a/ios/chrome/browser/ui/elements/instruction_view_constants.h b/ios/chrome/browser/ui/elements/instruction_view_constants.h deleted file mode 100644 index 51f805f..0000000 --- a/ios/chrome/browser/ui/elements/instruction_view_constants.h +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_ELEMENTS_INSTRUCTION_VIEW_CONSTANTS_H_ -#define IOS_CHROME_BROWSER_UI_ELEMENTS_INSTRUCTION_VIEW_CONSTANTS_H_ - -#import <Foundation/Foundation.h> - -namespace instruction_view { - -// Begin tag used to delimit part of text to put in bold. -extern NSString* const kInstructionViewBeginBoldTag; - -// End tag used to delimit part of text to put in bold. -extern NSString* const kInstructionViewEndBoldTag; - -} // instruction_view - -#endif // IOS_CHROME_BROWSER_UI_ELEMENTS_INSTRUCTION_VIEW_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/elements/instruction_view_constants.mm b/ios/chrome/browser/ui/elements/instruction_view_constants.mm deleted file mode 100644 index 68e643d4..0000000 --- a/ios/chrome/browser/ui/elements/instruction_view_constants.mm +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "ios/chrome/browser/ui/elements/instruction_view_constants.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace instruction_view { -NSString* const kInstructionViewBeginBoldTag = @"BEGIN_BOLD[ \t]*"; -NSString* const kInstructionViewEndBoldTag = @"[ \t]*END_BOLD"; -} // instruction_view
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn index 67aec53..1f7c4e20 100644 --- a/ios/chrome/browser/ui/first_run/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -233,7 +233,6 @@ "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", "//ios/chrome/browser/ui/authentication/signin:constants", "//ios/chrome/browser/ui/authentication/views:views_constants", - "//ios/chrome/browser/ui/elements:instruction_view_constants", "//ios/chrome/browser/ui/settings/google_services:constants", "//ios/chrome/common", "//ios/chrome/common/ui/promo_style:constants",
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm index aa8d26f..9ee4078d 100644 --- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -13,7 +13,6 @@ #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h" #import "ios/chrome/browser/ui/authentication/signin_matchers.h" #import "ios/chrome/browser/ui/authentication/views/views_constants.h" -#import "ios/chrome/browser/ui/elements/instruction_view_constants.h" #import "ios/chrome/browser/ui/first_run/first_run_app_interface.h" #import "ios/chrome/browser/ui/first_run/first_run_constants.h" #include "ios/chrome/browser/ui/first_run/fre_field_trial.h" @@ -53,6 +52,9 @@ NSString* const kMetricsConsentCheckboxAccessibilityIdentifier = @"kMetricsConsentCheckboxAccessibilityIdentifier"; +NSString* const kBeginBoldTag = @"BEGIN_BOLD[ \t]*"; +NSString* const kEndBoldTag = @"[ \t]*END_BOLD"; + // Add the field trial variation parameters to the app launch configuration. void SetupVariationForConfig(AppLaunchConfiguration& config, std::string position, @@ -623,18 +625,15 @@ StringWithTag firstInstructionParsed = ParseStringWithTag( l10n_util::GetNSString( IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_FIRST_STEP), - instruction_view::kInstructionViewBeginBoldTag, - instruction_view::kInstructionViewEndBoldTag); + kBeginBoldTag, kEndBoldTag); StringWithTag secondInstructionParsed = ParseStringWithTag( l10n_util::GetNSString( IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SECOND_STEP), - instruction_view::kInstructionViewBeginBoldTag, - instruction_view::kInstructionViewEndBoldTag); + kBeginBoldTag, kEndBoldTag); StringWithTag thirdInstructionParsed = ParseStringWithTag( l10n_util::GetNSString( IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_THIRD_STEP), - instruction_view::kInstructionViewBeginBoldTag, - instruction_view::kInstructionViewEndBoldTag); + kBeginBoldTag, kEndBoldTag); // Verify instruction order. id<GREYMatcher> firstInstruction = grey_text(firstInstructionParsed.string);
diff --git a/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn index d27eb2e..4fc3482 100644 --- a/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn
@@ -22,6 +22,7 @@ "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/browser/ui/table_view/cells:cells_constants", + "//ios/chrome/common", "//ios/web/public/permissions", "//ui/base", ]
diff --git a/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm index 2ea4355e..8877d57 100644 --- a/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm +++ b/ios/chrome/browser/ui/infobars/modals/permissions/infobar_permissions_table_view_controller.mm
@@ -14,11 +14,12 @@ #import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_handler.h" #include "ios/chrome/browser/ui/permissions/permission_info.h" #import "ios/chrome/browser/ui/permissions/permission_metrics_util.h" +#import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_switch_cell.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_switch_item.h" -#import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" +#include "ios/chrome/common/string_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/web/public/permissions/permissions.h" @@ -155,14 +156,24 @@ #pragma mark - Private Methods // Helper that returns the permissionsDescription item. -- (TableViewTextItem*)permissionsDescriptionItem { - TableViewTextItem* descriptionItem = - [[TableViewTextItem alloc] initWithType:ItemTypePermissionsDescription]; - descriptionItem.text = self.permissionsDescription; - descriptionItem.textColor = [UIColor colorNamed:kTextSecondaryColor]; - descriptionItem.textFont = - [UIFont preferredFontForTextStyle:kTableViewSublabelFontStyle]; - descriptionItem.enabled = NO; +- (SettingsImageDetailTextItem*)permissionsDescriptionItem { + SettingsImageDetailTextItem* descriptionItem = + [[SettingsImageDetailTextItem alloc] + initWithType:ItemTypePermissionsDescription]; + + NSMutableAttributedString* descriptionAttributedString = + [[NSMutableAttributedString alloc] + initWithAttributedString:PutBoldPartInString( + self.permissionsDescription, + kTableViewSublabelFontStyle)]; + + NSDictionary* attrs = @{ + NSForegroundColorAttributeName : [UIColor colorNamed:kTextSecondaryColor] + }; + [descriptionAttributedString + addAttributes:attrs + range:NSMakeRange(0, descriptionAttributedString.length)]; + descriptionItem.attributedText = descriptionAttributedString; return descriptionItem; }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm index df66de6..3b69f59 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -1022,14 +1022,15 @@ - (void)requestDesktopSite { RecordAction(UserMetricsAction("MobileMenuRequestDesktopSite")); [self.dispatcher dismissPopupMenuAnimated:YES]; - [self.dispatcher requestDesktopSite]; + self.navigationAgent->RequestDesktopSite(); + [self.dispatcher showDefaultSiteViewIPH]; } // Dismisses the menu and requests the mobile version of the current page - (void)requestMobileSite { RecordAction(UserMetricsAction("MobileMenuRequestMobileSite")); [self.dispatcher dismissPopupMenuAnimated:YES]; - [self.dispatcher requestMobileSite]; + self.navigationAgent->RequestMobileSite(); } // Dismisses the menu and opens Find In Page
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm index e9cdf270..1342453 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
@@ -86,11 +86,12 @@ break; case PopupMenuActionRequestDesktop: RecordAction(UserMetricsAction("MobileMenuRequestDesktopSite")); - [self.dispatcher requestDesktopSite]; + self.navigationAgent->RequestDesktopSite(); + [self.dispatcher showDefaultSiteViewIPH]; break; case PopupMenuActionRequestMobile: RecordAction(UserMetricsAction("MobileMenuRequestMobileSite")); - [self.dispatcher requestMobileSite]; + self.navigationAgent->RequestMobileSite(); break; case PopupMenuActionSiteInformation: RecordAction(UserMetricsAction("MobileMenuSiteInformation"));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm index 8dd4e94..73879a6 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -1317,7 +1317,10 @@ // Adds the top toolbar and sets constraints. - (void)setupTopToolbar { - TabGridTopToolbar* topToolbar = [[TabGridTopToolbar alloc] init]; + // In iOS 13+, constraints break if the UIToolbar is initialized with a null + // or zero rect frame. An arbitrary non-zero frame fixes this issue. + TabGridTopToolbar* topToolbar = + [[TabGridTopToolbar alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; self.topToolbar = topToolbar; topToolbar.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:topToolbar];
diff --git a/ios/chrome/browser/ui/webui/policy/policy_ui.mm b/ios/chrome/browser/ui/webui/policy/policy_ui.mm index 22910da..9e8821d 100644 --- a/ios/chrome/browser/ui/webui/policy/policy_ui.mm +++ b/ios/chrome/browser/ui/webui/policy/policy_ui.mm
@@ -55,8 +55,6 @@ {"labelPrecedence", IDS_POLICY_LABEL_PRECEDENCE}, {"labelRefreshInterval", IDS_POLICY_LABEL_REFRESH_INTERVAL}, {"labelStatus", IDS_POLICY_LABEL_STATUS}, - {"labelTimeSinceLastFetchAttempt", - IDS_POLICY_LABEL_TIME_SINCE_LAST_FETCH_ATTEMPT}, {"labelTimeSinceLastRefresh", IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH}, {"labelUsername", IDS_POLICY_LABEL_USERNAME}, {"labelManagedBy", IDS_POLICY_LABEL_MANAGED_BY},
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn index 9d93706..4e6912f0 100644 --- a/ios/chrome/browser/web/BUILD.gn +++ b/ios/chrome/browser/web/BUILD.gn
@@ -38,6 +38,7 @@ "//base", "//components/content_settings/core/browser", "//components/error_page/common", + "//components/feature_engagement/public", "//components/infobars/core", "//components/pref_registry", "//components/resources:components_resources_grit", @@ -50,6 +51,7 @@ "//ios/chrome/browser", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/content_settings", + "//ios/chrome/browser/feature_engagement", "//ios/chrome/browser/infobars", "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/main:public", @@ -65,6 +67,7 @@ "//ios/net", "//ios/web", "//ios/web/common", + "//ios/web/common:user_agent", "//ios/web/public/js_messaging", "//ios/web/public/security", "//ios/web/public/session",
diff --git a/ios/chrome/browser/web/web_navigation_browser_agent.h b/ios/chrome/browser/web/web_navigation_browser_agent.h index 3e45c0a..28b7eac 100644 --- a/ios/chrome/browser/web/web_navigation_browser_agent.h +++ b/ios/chrome/browser/web/web_navigation_browser_agent.h
@@ -6,11 +6,16 @@ #define IOS_CHROME_BROWSER_WEB_WEB_NAVIGATION_BROWSER_AGENT_H_ #import "ios/chrome/browser/main/browser_user_data.h" +#include "ios/web/common/user_agent.h" class Browser; @protocol WebNavigationNTPDelegate; class WebStateList; +namespace web { +class WebState; +} + // A browser agent that encapsulates logic for common web navigation tasks on // the current active web state in the associated browser. class WebNavigationBrowserAgent @@ -41,17 +46,29 @@ void StopLoading(); // Reloads the active web state. void Reload(); + // Requests the "desktop" version of the current page in the active tab + void RequestDesktopSite(); + // Requests the "mobile" version of the current page in the active tab. + void RequestMobileSite(); private: friend class BrowserUserData<WebNavigationBrowserAgent>; explicit WebNavigationBrowserAgent(Browser* browser); BROWSER_USER_DATA_KEY_DECL(); + // Reloads the original url of the last non-redirect item (including + // non-history items) with |userAgentType|. + void ReloadWithUserAgentType(web::UserAgentType userAgentType); + // Return the UserAgentType for a given |web_state|. + web::UserAgentType UserAgentType(web::WebState* web_state); + // The web state list for the associated browser. This should never be // null. WebStateList* web_state_list_; // The delegate, if assigned. This may be nil. id<WebNavigationNTPDelegate> delegate_; + // The associated browser. + Browser* browser_; }; #endif // IOS_CHROME_BROWSER_WEB_WEB_NAVIGATION_BROWSER_AGENT_H_
diff --git a/ios/chrome/browser/web/web_navigation_browser_agent.mm b/ios/chrome/browser/web/web_navigation_browser_agent.mm index 93aa6635..d8944e6 100644 --- a/ios/chrome/browser/web/web_navigation_browser_agent.mm +++ b/ios/chrome/browser/web/web_navigation_browser_agent.mm
@@ -4,9 +4,14 @@ #import "ios/chrome/browser/web/web_navigation_browser_agent.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/tracker.h" +#include "ios/chrome/browser/feature_engagement/tracker_factory.h" #import "ios/chrome/browser/web/web_navigation_ntp_delegate.h" #import "ios/chrome/browser/web/web_navigation_util.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" +#include "ios/web/common/user_agent.h" +#import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/web_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -16,7 +21,7 @@ BROWSER_USER_DATA_KEY_IMPL(WebNavigationBrowserAgent) WebNavigationBrowserAgent::WebNavigationBrowserAgent(Browser* browser) - : web_state_list_(browser->GetWebStateList()) {} + : web_state_list_(browser->GetWebStateList()), browser_(browser) {} WebNavigationBrowserAgent::~WebNavigationBrowserAgent() {} @@ -66,3 +71,38 @@ id<WebNavigationNTPDelegate> delegate) { delegate_ = delegate; } + +void WebNavigationBrowserAgent::RequestDesktopSite() { + ReloadWithUserAgentType(web::UserAgentType::DESKTOP); + + feature_engagement::TrackerFactory::GetForBrowserState( + browser_->GetBrowserState()) + ->NotifyEvent(feature_engagement::events::kDesktopVersionRequested); +} + +void WebNavigationBrowserAgent::RequestMobileSite() { + ReloadWithUserAgentType(web::UserAgentType::MOBILE); +} + +void WebNavigationBrowserAgent::ReloadWithUserAgentType( + web::UserAgentType userAgentType) { + web::WebState* web_state = web_state_list_->GetActiveWebState(); + if (UserAgentType(web_state) == userAgentType) + return; + + web_state->GetNavigationManager()->ReloadWithUserAgentType(userAgentType); +} + +web::UserAgentType WebNavigationBrowserAgent::UserAgentType( + web::WebState* web_state) { + if (!web_state) { + return web::UserAgentType::NONE; + } + web::NavigationItem* visibleItem = + web_state->GetNavigationManager()->GetVisibleItem(); + if (!visibleItem) { + return web::UserAgentType::NONE; + } + + return visibleItem->GetUserAgentType(); +}
diff --git a/ios/chrome/common/string_util.h b/ios/chrome/common/string_util.h index 35018d20..ab27a97 100644 --- a/ios/chrome/common/string_util.h +++ b/ios/chrome/common/string_util.h
@@ -90,4 +90,10 @@ // |characterRange| in the |textView|. CGRect TextViewLinkBound(UITextView* textView, NSRange characterRange); +// Parses a string with an embedded bold part inside, delineated by +// "BEGIN_BOLD" and "END_BOLD". Returns an attributed string with bold part and +// the given font style. +NSAttributedString* PutBoldPartInString(NSString* string, + UIFontTextStyle font_style); + #endif // IOS_CHROME_COMMON_STRING_UTIL_H_
diff --git a/ios/chrome/common/string_util.mm b/ios/chrome/common/string_util.mm index 473cab5..888d398 100644 --- a/ios/chrome/common/string_util.mm +++ b/ios/chrome/common/string_util.mm
@@ -18,6 +18,8 @@ typedef NSString* (^SubstringExtractionProcedure)(NSUInteger); NSString* const kBeginLinkTag = @"BEGIN_LINK[ \t]*"; NSString* const kEndLinkTag = @"[ \t]*END_LINK"; +NSString* const kBeginBoldTag = @"BEGIN_BOLD[ \t]*"; +NSString* const kEndBoldTag = @"[ \t]*END_BOLD"; } StringWithTags::StringWithTags() = default; @@ -273,3 +275,28 @@ return rect; } + +NSAttributedString* PutBoldPartInString(NSString* string, + UIFontTextStyle font_style) { + UIFontDescriptor* default_descriptor = + [UIFontDescriptor preferredFontDescriptorWithTextStyle:font_style]; + UIFontDescriptor* bold_descriptor = + [[UIFontDescriptor preferredFontDescriptorWithTextStyle:font_style] + fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; + StringWithTag parsed_string = + ParseStringWithTag(string, kBeginBoldTag, kEndBoldTag); + + NSMutableAttributedString* attributed_string = + [[NSMutableAttributedString alloc] initWithString:parsed_string.string]; + [attributed_string addAttribute:NSFontAttributeName + value:[UIFont fontWithDescriptor:default_descriptor + size:0.0] + range:NSMakeRange(0, parsed_string.string.length)]; + + [attributed_string addAttribute:NSFontAttributeName + value:[UIFont fontWithDescriptor:bold_descriptor + size:0.0] + range:parsed_string.range]; + + return attributed_string; +}
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index da51628..23bbe254 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -7fb71022b1228ab7f7983d4fb31feebd570875be \ No newline at end of file +64a561ba8314904b646303daca3280fa91843058 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index dabb66f..a8210e3 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -5c644e4b74e03584c0036f5bc7aa36dd47684d35 \ No newline at end of file +760fb9cd718242c7232237f67d4180f8b7612856 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 525378e..9790d4c 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -843be6cae668e5f0153ed181a362de0c7a4a9101 \ No newline at end of file +433fd594a645200e0ae148b6bec85149b36ea2c5 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 2aa55673..75bf7c9 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e5b00036ed50811eba28beb90e32d158c1354cf9 \ No newline at end of file +f8f773745196a6b0ffd8ce877bcff7318156ddf0 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index 6fa52be..34552432 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -a8769fb2cc44c1f6f5152482b1fa3068f314ef74 \ No newline at end of file +175b5c319ebe32939236c1e03f7d33513f399dc1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 7bf12a0..e75cd72 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -1fa87f754b9860d8c74e1d0e941e39eadd36faa5 \ No newline at end of file +c9f2afcee32d6408175f02a32c3d342310bbf0d0 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index c203b29..72d7bbb 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -2ee9d15cb3c9db531e5444678957a8586aca849b \ No newline at end of file +aa92b31fcddb2ef7a364ba012e4f1ea1abece71b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 9eb496a0..75e66d1 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -50a5a3a5e2f0a729b151eebde7421730e008f084 \ No newline at end of file +8cf6ff9c3fe3cab2b01b8717119998df83069f11 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index c4c83584..8ca38cf 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -29c24541cc0a68f47255a4756cc50b71f2ac9c81 \ No newline at end of file +d19a5d2fb06a4283c8283fd92fe0319ade4e9d07 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 83c9e83..132f5531 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -0d5d8587aadcd30f5bf838d87444b9c68e5a8e9f \ No newline at end of file +0e04e5bd2e9e67bb694f2fa677ed951d26c45f57 \ No newline at end of file
diff --git a/ios/web/public/test/fakes/fake_navigation_manager.h b/ios/web/public/test/fakes/fake_navigation_manager.h index be87b22..1500cb5 100644 --- a/ios/web/public/test/fakes/fake_navigation_manager.h +++ b/ios/web/public/test/fakes/fake_navigation_manager.h
@@ -79,9 +79,15 @@ // Returns whether LoadIfNecessary has been called. bool LoadIfNecessaryWasCalled(); - // Returns whether Reload has been called; + // Returns whether Reload has been called. bool ReloadWasCalled(); + // Returns whether RequestDesktopSite has been called. + bool RequestDesktopSiteWasCalled(); + + // Returns whether RequestMobileSite has been called. + bool RequestMobileSiteWasCalled(); + private: // A list of items constructed by calling AddItem(). std::vector<std::unique_ptr<NavigationItem>> items_; @@ -95,6 +101,8 @@ bool load_url_with_params_was_called_; bool load_if_necessary_was_called_; bool reload_was_called_; + bool request_desktop_site_was_called_; + bool request_mobile_site_was_called_; }; } // namespace web
diff --git a/ios/web/public/test/fakes/fake_navigation_manager.mm b/ios/web/public/test/fakes/fake_navigation_manager.mm index 98c7d5d..8294abd 100644 --- a/ios/web/public/test/fakes/fake_navigation_manager.mm +++ b/ios/web/public/test/fakes/fake_navigation_manager.mm
@@ -141,7 +141,11 @@ void FakeNavigationManager::ReloadWithUserAgentType( UserAgentType user_agent_type) { - NOTREACHED(); + if (user_agent_type == web::UserAgentType::MOBILE) { + request_mobile_site_was_called_ = true; + } else if (user_agent_type == web::UserAgentType::DESKTOP) { + request_desktop_site_was_called_ = true; + } } std::vector<NavigationItem*> FakeNavigationManager::GetBackwardItems() const { @@ -201,4 +205,12 @@ return reload_was_called_; } +bool FakeNavigationManager::RequestDesktopSiteWasCalled() { + return request_desktop_site_was_called_; +} + +bool FakeNavigationManager::RequestMobileSiteWasCalled() { + return request_mobile_site_was_called_; +} + } // namespace web
diff --git a/ios/web/shell/Info.plist b/ios/web/shell/Info.plist index ff7d768d..fa518fa 100644 --- a/ios/web/shell/Info.plist +++ b/ios/web/shell/Info.plist
@@ -29,6 +29,10 @@ <key>NSAllowsArbitraryLoads</key> <true/> </dict> + <key>NSCameraUsageDescription</key> + <string>IDS_IOS_CAMERA_USAGE_DESCRIPTION</string> + <key>NSMicrophoneUsageDescription</key> + <string>IDS_IOS_MICROPHONE_USAGE_DESCRIPTION</string> <key>UIFileSharingEnabled</key> <true/> <key>UIRequiredDeviceCapabilities</key>
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn index a787e1b4..cc64386fd 100644 --- a/ios/web_view/BUILD.gn +++ b/ios/web_view/BUILD.gn
@@ -56,6 +56,7 @@ "public/cwv_flags.h", "public/cwv_html_element.h", "public/cwv_identity.h", + "public/cwv_lookalike_url_handler.h", "public/cwv_metrics_provider.h", "public/cwv_navigation_action.h", "public/cwv_navigation_delegate.h", @@ -132,6 +133,8 @@ "internal/cwv_flags_internal.h", "internal/cwv_html_element.mm", "internal/cwv_html_element_internal.h", + "internal/cwv_lookalike_url_handler.mm", + "internal/cwv_lookalike_url_handler_internal.h", "internal/cwv_navigation_action.mm", "internal/cwv_navigation_action_internal.h", "internal/cwv_navigation_type.mm", @@ -287,6 +290,7 @@ "//components/language/core/language_model", "//components/language/ios/browser", "//components/leveldb_proto", + "//components/lookalikes/core", "//components/metrics:library_support", "//components/metrics/demographics", "//components/password_manager/core/browser", @@ -444,6 +448,7 @@ "internal/cwv_favicon_unittest.mm", "internal/cwv_flags_unittest.mm", "internal/cwv_html_element_unittest.mm", + "internal/cwv_lookalike_url_handler_unittest.mm", "internal/cwv_preferences_unittest.mm", "internal/cwv_preview_element_info_unittest.mm", "internal/cwv_ssl_error_handler_unittest.mm",
diff --git a/ios/web_view/internal/DEPS b/ios/web_view/internal/DEPS index b3625a48..6d95045 100644 --- a/ios/web_view/internal/DEPS +++ b/ios/web_view/internal/DEPS
@@ -16,6 +16,7 @@ "+components/language/core/common", "+components/language/core/language_model", "+components/leveldb_proto/public", + "+components/lookalikes/core", "+components/metrics/demographics", "+components/metrics/library_support", "+components/net_log",
diff --git a/ios/web_view/internal/cwv_lookalike_url_handler.mm b/ios/web_view/internal/cwv_lookalike_url_handler.mm new file mode 100644 index 0000000..ad30f9c --- /dev/null +++ b/ios/web_view/internal/cwv_lookalike_url_handler.mm
@@ -0,0 +1,92 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web_view/internal/cwv_lookalike_url_handler_internal.h" + +#include "ios/components/security_interstitials/lookalikes/lookalike_url_tab_allow_list.h" +#import "ios/web/public/navigation/navigation_manager.h" +#import "net/base/mac/url_conversions.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation CWVLookalikeURLHandler { + web::WebState* _webState; + std::unique_ptr<LookalikeUrlContainer::LookalikeUrlInfo> _lookalikeURLInfo; + base::OnceCallback<void(NSString*)> _htmlCallback; +} + +- (instancetype) + initWithWebState:(web::WebState*)webState + lookalikeURLInfo:(std::unique_ptr<LookalikeUrlContainer::LookalikeUrlInfo>) + lookalikeURLInfo + htmlCallback:(base::OnceCallback<void(NSString*)>)htmlCallback { + self = [super init]; + if (self) { + _webState = webState; + _lookalikeURLInfo = std::move(lookalikeURLInfo); + _htmlCallback = std::move(htmlCallback); + } + return self; +} + +#pragma mark - Public Methods + +- (NSURL*)requestURL { + return net::NSURLWithGURL(_lookalikeURLInfo->request_url); +} + +- (nullable NSURL*)safeURL { + if ([self isSafeURLValid]) { + return net::NSURLWithGURL(_lookalikeURLInfo->safe_url); + } else { + return nil; + } +} + +- (void)displayInterstitialPageWithHTML:(NSString*)HTML { + if (_htmlCallback) { + std::move(_htmlCallback).Run(HTML); + } +} + +- (BOOL)commitDecision:(CWVLookalikeURLHandlerDecision)decision { + switch (decision) { + case CWVLookalikeURLHandlerDecisionProceedToRequestURL: { + LookalikeUrlTabAllowList::FromWebState(_webState)->AllowDomain( + _lookalikeURLInfo->request_url.host()); + _webState->GetNavigationManager()->Reload(web::ReloadType::NORMAL, + /*check_for_repost=*/true); + return YES; + } + case CWVLookalikeURLHandlerDecisionProceedToSafeURL: { + if ([self isSafeURLValid]) { + _webState->OpenURL(web::WebState::OpenURLParams( + _lookalikeURLInfo->safe_url, web::Referrer(), + WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_LINK, + /*is_renderer_initiated=*/false)); + return YES; + } else { + return NO; + } + } + case CWVLookalikeURLHandlerDecisionGoBackOrClose: { + if (_webState->GetNavigationManager()->CanGoBack()) { + _webState->GetNavigationManager()->GoBack(); + } else { + _webState->CloseWebState(); + } + return YES; + } + } +} + +#pragma mark - Private Methods + +- (BOOL)isSafeURLValid { + return _lookalikeURLInfo->safe_url.is_valid(); +} + +@end
diff --git a/ios/web_view/internal/cwv_lookalike_url_handler_internal.h b/ios/web_view/internal/cwv_lookalike_url_handler_internal.h new file mode 100644 index 0000000..598ab9d --- /dev/null +++ b/ios/web_view/internal/cwv_lookalike_url_handler_internal.h
@@ -0,0 +1,28 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_VIEW_INTERNAL_CWV_LOOKALIKE_URL_HANDLER_INTERNAL_H_ +#define IOS_WEB_VIEW_INTERNAL_CWV_LOOKALIKE_URL_HANDLER_INTERNAL_H_ + +#import "base/callback.h" +#import "ios/components/security_interstitials/lookalikes/lookalike_url_container.h" +#import "ios/web/public/web_state.h" +#import "ios/web_view/public/cwv_lookalike_url_handler.h" + +@interface CWVLookalikeURLHandler () + +// Designated initializer. +// |webState| The associated web state. +// |lookalikeURLInfo| Encapsulates information about the lookalike URL. +// |htmlCallback| A callback that can be used to display an interstitial page. +- (instancetype) + initWithWebState:(web::WebState*)webState + lookalikeURLInfo:(std::unique_ptr<LookalikeUrlContainer::LookalikeUrlInfo>) + lookalikeURLInfo + htmlCallback:(base::OnceCallback<void(NSString*)>)htmlCallback + NS_DESIGNATED_INITIALIZER; + +@end + +#endif // IOS_WEB_VIEW_INTERNAL_CWV_LOOKALIKE_URL_HANDLER_INTERNAL_H_
diff --git a/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm b/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm new file mode 100644 index 0000000..e335e43 --- /dev/null +++ b/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm
@@ -0,0 +1,162 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web_view/internal/cwv_lookalike_url_handler_internal.h" + +#include "base/bind.h" +#include "base/callback.h" +#include "base/callback_helpers.h" +#include "components/lookalikes/core/lookalike_url_util.h" +#import "ios/components/security_interstitials/lookalikes/lookalike_url_container.h" +#import "ios/components/security_interstitials/lookalikes/lookalike_url_tab_allow_list.h" +#import "ios/web/public/test/fakes/fake_navigation_manager.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#import "net/base/mac/url_conversions.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace ios_web_view { + +class CWVLookalikeURLHandlerTest : public PlatformTest { + public: + CWVLookalikeURLHandlerTest(const CWVLookalikeURLHandlerTest&) = delete; + CWVLookalikeURLHandlerTest& operator=(const CWVLookalikeURLHandlerTest&) = + delete; + + protected: + CWVLookalikeURLHandlerTest() { + auto navigation_manager = std::make_unique<web::FakeNavigationManager>(); + web_state_.SetNavigationManager(std::move(navigation_manager)); + + LookalikeUrlTabAllowList::CreateForWebState(&web_state_); + } + + CWVLookalikeURLHandler* GetHandler( + const GURL& safe_url, + const GURL& request_url, + base::OnceCallback<void(NSString*)> callback) { + auto url_info = std::make_unique<LookalikeUrlContainer::LookalikeUrlInfo>( + safe_url, request_url, LookalikeUrlMatchType::kSiteEngagement); + return + [[CWVLookalikeURLHandler alloc] initWithWebState:&web_state_ + lookalikeURLInfo:std::move(url_info) + htmlCallback:std::move(callback)]; + } + + web::FakeNavigationManager* GetNavigationManager() { + return static_cast<web::FakeNavigationManager*>( + web_state_.GetNavigationManager()); + } + + web::FakeWebState web_state_; +}; + +TEST_F(CWVLookalikeURLHandlerTest, ValidSafeURL) { + GURL safe_url = GURL("https://www.chromium.org"); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + EXPECT_EQ(request_url, net::GURLWithNSURL(handler.requestURL)); + EXPECT_EQ(safe_url, net::GURLWithNSURL(handler.safeURL)); +} + +TEST_F(CWVLookalikeURLHandlerTest, InvalidSafeURL) { + GURL safe_url = GURL(); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + EXPECT_EQ(request_url, net::GURLWithNSURL(handler.requestURL)); + EXPECT_FALSE(handler.safeURL); +} + +TEST_F(CWVLookalikeURLHandlerTest, DisplayHTMLCallback) { + __block NSString* callback_html = nil; + __block int callback_count = 0; + base::OnceCallback callback = base::BindOnce(^(NSString* html) { + ++callback_count; + callback_html = html; + }); + CWVLookalikeURLHandler* handler = + GetHandler(GURL(), GURL(), std::move(callback)); + + [handler displayInterstitialPageWithHTML:@"foo"]; + EXPECT_NSEQ(@"foo", callback_html); + EXPECT_EQ(1, callback_count); + + // Second call should be a no op. + [handler displayInterstitialPageWithHTML:@"bar"]; + EXPECT_NSEQ(@"foo", callback_html); + EXPECT_EQ(1, callback_count); +} + +TEST_F(CWVLookalikeURLHandlerTest, ProceedToRequestURL) { + GURL safe_url = GURL("https://www.chromium.org"); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + BOOL result = [handler + commitDecision:CWVLookalikeURLHandlerDecisionProceedToRequestURL]; + EXPECT_TRUE(result); + EXPECT_TRUE(GetNavigationManager()->ReloadWasCalled()); + LookalikeUrlTabAllowList* allow_list = + LookalikeUrlTabAllowList::FromWebState(&web_state_); + EXPECT_TRUE(allow_list->IsDomainAllowed(request_url.host())); +} + +TEST_F(CWVLookalikeURLHandlerTest, ProceedToInvalidSafeURL) { + GURL safe_url = GURL(); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + BOOL result = + [handler commitDecision:CWVLookalikeURLHandlerDecisionProceedToSafeURL]; + EXPECT_FALSE(result); +} + +TEST_F(CWVLookalikeURLHandlerTest, ProceedToValidSafeURL) { + GURL safe_url = GURL("https://www.chromium.org"); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + BOOL result = + [handler commitDecision:CWVLookalikeURLHandlerDecisionProceedToSafeURL]; + EXPECT_TRUE(result); +} + +TEST_F(CWVLookalikeURLHandlerTest, GoBack) { + GetNavigationManager()->AddItem(GURL("https://www.example.com"), + ui::PAGE_TRANSITION_TYPED); + GetNavigationManager()->AddItem(GURL("https://www.example2.com"), + ui::PAGE_TRANSITION_TYPED); + + GURL safe_url = GURL("https://www.chromium.org"); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + EXPECT_TRUE(GetNavigationManager()->CanGoBack()); + int item_index = GetNavigationManager()->GetLastCommittedItemIndex(); + BOOL result = + [handler commitDecision:CWVLookalikeURLHandlerDecisionGoBackOrClose]; + EXPECT_TRUE(result); + EXPECT_EQ(item_index - 1, + GetNavigationManager()->GetLastCommittedItemIndex()); +} + +TEST_F(CWVLookalikeURLHandlerTest, Close) { + GURL safe_url = GURL("https://www.chromium.org"); + GURL request_url = GURL("https://www.chr0mium.org"); + CWVLookalikeURLHandler* handler = + GetHandler(safe_url, request_url, base::DoNothing()); + BOOL result = + [handler commitDecision:CWVLookalikeURLHandlerDecisionGoBackOrClose]; + EXPECT_TRUE(result); + EXPECT_TRUE(web_state_.IsClosed()); +} + +} // ios_web_view
diff --git a/ios/web_view/public/cwv_lookalike_url_handler.h b/ios/web_view/public/cwv_lookalike_url_handler.h new file mode 100644 index 0000000..48032d20 --- /dev/null +++ b/ios/web_view/public/cwv_lookalike_url_handler.h
@@ -0,0 +1,54 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_VIEW_PUBLIC_CWV_LOOKALIKE_URL_HANDLER_H_ +#define IOS_WEB_VIEW_PUBLIC_CWV_LOOKALIKE_URL_HANDLER_H_ + +#import <Foundation/Foundation.h> + +#import "cwv_export.h" + +NS_ASSUME_NONNULL_BEGIN + +// Enumerates possible decisions that can be made. +typedef NS_ENUM(NSInteger, CWVLookalikeURLHandlerDecision) { + // Continue navigation to the original requested URL. + CWVLookalikeURLHandlerDecisionProceedToRequestURL, + // Change navigation to the suggested safe URL, if any. + CWVLookalikeURLHandlerDecisionProceedToSafeURL, + // Navigates back or closes the web view if there's nothing to go back to. + CWVLookalikeURLHandlerDecisionGoBackOrClose, +}; + +// Used to make a decision on whether or not to load a lookalike URL. +// The client should block other user decisions, like manually navigating back, +// until this handler is resolved by |commitDecision:|. +CWV_EXPORT +@interface CWVLookalikeURLHandler : NSObject + +// The requested URL that looks like some other well known URL. +@property(nonatomic, readonly) NSURL* requestURL; + +// The URL that |requestURL| may have been pretending to be. +// May be nil if there is no safe alternative. +@property(nonatomic, nullable, readonly) NSURL* safeURL; + +- (instancetype)init NS_UNAVAILABLE; + +// Display an interstitial page with |HTML|. +// This will be a no-op after the first call. +- (void)displayInterstitialPageWithHTML:(NSString*)HTML; + +// Resolves the handler by taking the action indicated by |decision|. +// Returns a BOOL indicating if the decision was accepted. +// Returns NO if you attempt to proceed to a nil |safeURL|. +// This handler is considered resolved after the first call that returns YES, +// and will be no-op thereafter +- (BOOL)commitDecision:(CWVLookalikeURLHandlerDecision)decision; + +@end + +NS_ASSUME_NONNULL_END + +#endif // IOS_WEB_VIEW_PUBLIC_CWV_LOOKALIKE_URL_HANDLER_H_
diff --git a/media/base/bitrate.cc b/media/base/bitrate.cc index bc904df..b265cc90 100644 --- a/media/base/bitrate.cc +++ b/media/base/bitrate.cc
@@ -9,33 +9,33 @@ namespace media { // static -Bitrate Bitrate::VariableBitrate(uint32_t target_bitrate, - uint32_t peak_bitrate) { - DCHECK_GE(peak_bitrate, target_bitrate); - return Bitrate(Mode::kVariable, target_bitrate, peak_bitrate); +Bitrate Bitrate::VariableBitrate(uint32_t target_bps, uint32_t peak_bps) { + DCHECK_GE(peak_bps, target_bps); + return Bitrate(Mode::kVariable, target_bps, peak_bps); } bool Bitrate::operator==(const Bitrate& right) const { - return (this->mode_ == right.mode_) && (this->target_ == right.target_) && - (this->peak_ == right.peak_); + return (this->mode_ == right.mode_) && + (this->target_bps_ == right.target_bps_) && + (this->peak_bps_ == right.peak_bps_); } bool Bitrate::operator!=(const Bitrate& right) const { return !(*this == right); } -uint32_t Bitrate::peak() const { - DCHECK_EQ(mode_ == Mode::kConstant, peak_ == 0u); - return peak_; +uint32_t Bitrate::peak_bps() const { + DCHECK_EQ(mode_ == Mode::kConstant, peak_bps_ == 0u); + return peak_bps_; } std::string Bitrate::ToString() const { switch (mode_) { case Mode::kConstant: - return base::StringPrintf("CBR: %d bps", target_); + return base::StringPrintf("CBR: %d bps", target_bps_); case Mode::kVariable: - return base::StringPrintf("VBR: target %d bps, peak %d bps", target_, - peak_); + return base::StringPrintf("VBR: target %d bps, peak %d bps", target_bps_, + peak_bps_); } }
diff --git a/media/base/bitrate.h b/media/base/bitrate.h index 1d18962..f72692b5 100644 --- a/media/base/bitrate.h +++ b/media/base/bitrate.h
@@ -30,28 +30,25 @@ // or 64-bit value you want to use as input, you must explicitly convert to // uint32_t before calling. This is intended to prevent implicit and unsafe // type conversion. - static constexpr Bitrate ConstantBitrate(uint32_t target_bitrate) { - return Bitrate(Mode::kConstant, target_bitrate, 0); + static constexpr Bitrate ConstantBitrate(uint32_t target_bps) { + return Bitrate(Mode::kConstant, target_bps, 0); } - static Bitrate VariableBitrate(uint32_t target_bitrate, - uint32_t peak_bitrate); + static Bitrate VariableBitrate(uint32_t target_bps, uint32_t peak_bps); // Deleted variants: you must SAFELY convert to uint32_t before calling. // See base/numerics/safe_conversions.h for functions to safely convert // between types. - static Bitrate ConstantBitrate(int target_bitrate) = delete; - static Bitrate VariableBitrate(int target_bitrate, int peak_bitrate) = delete; - static Bitrate VariableBitrate(int target_bitrate, - uint32_t peak_bitrate) = delete; - static Bitrate VariableBitrate(uint32_t target_bitrate, - int peak_bitrate) = delete; - static Bitrate ConstantBitrate(uint64_t target_bitrate) = delete; - static Bitrate VariableBitrate(uint64_t target_bitrate, - uint64_t peak_bitrate) = delete; - static Bitrate VariableBitrate(uint64_t target_bitrate, - uint32_t peak_bitrate) = delete; - static Bitrate VariableBitrate(uint32_t target_bitrate, - uint64_t peak_bitrate) = delete; + static Bitrate ConstantBitrate(int target_bps) = delete; + static Bitrate VariableBitrate(int target_bps, int peak_bps) = delete; + static Bitrate VariableBitrate(int target_bps, uint32_t peak_bps) = delete; + static Bitrate VariableBitrate(uint32_t target_bps, int peak_bps) = delete; + static Bitrate ConstantBitrate(uint64_t target_bps) = delete; + static Bitrate VariableBitrate(uint64_t target_bps, + uint64_t peak_bps) = delete; + static Bitrate VariableBitrate(uint64_t target_bps, + uint32_t peak_bps) = delete; + static Bitrate VariableBitrate(uint32_t target_bps, + uint64_t peak_bps) = delete; bool operator==(const Bitrate& right) const; bool operator!=(const Bitrate& right) const; @@ -60,17 +57,17 @@ constexpr Mode mode() const { return mode_; } // Accessor for |target_|. - constexpr uint32_t target() const { return target_; } + constexpr uint32_t target_bps() const { return target_bps_; } // Accessor for |peak_|. Returns 0 if |mode_| is // Mode::kConstantBitrate. - uint32_t peak() const; + uint32_t peak_bps() const; std::string ToString() const; private: - constexpr Bitrate(Mode mode, uint32_t target_bitrate, uint32_t peak_bitrate) - : mode_(mode), target_(target_bitrate), peak_(peak_bitrate) {} + constexpr Bitrate(Mode mode, uint32_t target_bps, uint32_t peak_bps) + : mode_(mode), target_bps_(target_bps), peak_bps_(peak_bps) {} // These member variables cannot be const (despite the intent that we do not // change them after creation) because we must have an assignment operator for @@ -81,10 +78,10 @@ Mode mode_ = Mode::kConstant; // Target bitrate for the stream in bits per second. - uint32_t target_ = 0u; + uint32_t target_bps_ = 0u; // For use with Mode::kVariable. Peak bitrate in bits per second. - uint32_t peak_ = 0u; + uint32_t peak_bps_ = 0u; }; } // namespace media
diff --git a/media/gpu/android/android_video_encode_accelerator.cc b/media/gpu/android/android_video_encode_accelerator.cc index 8639ac2d..937af1bd 100644 --- a/media/gpu/android/android_video_encode_accelerator.cc +++ b/media/gpu/android/android_video_encode_accelerator.cc
@@ -185,7 +185,7 @@ } frame_size_ = config.input_visible_size; - last_set_bitrate_ = config.bitrate.target(); + last_set_bitrate_ = config.bitrate.target_bps(); // Only consider using MediaCodec if it's likely backed by hardware. if (MediaCodecUtil::IsKnownUnaccelerated(codec, @@ -200,7 +200,7 @@ return false; } media_codec_ = MediaCodecBridgeImpl::CreateVideoEncoder( - codec, config.input_visible_size, config.bitrate.target(), + codec, config.input_visible_size, config.bitrate.target_bps(), INITIAL_FRAMERATE, i_frame_interval, pixel_format); if (!media_codec_) { @@ -293,9 +293,9 @@ DVLOG(3) << __PRETTY_FUNCTION__ << ": bitrate: " << bitrate.ToString() << ", framerate: " << framerate; DCHECK(thread_checker_.CalledOnValidThread()); - if (bitrate.target() != last_set_bitrate_) { - last_set_bitrate_ = bitrate.target(); - media_codec_->SetVideoBitrate(bitrate.target(), framerate); + if (bitrate.target_bps() != last_set_bitrate_) { + last_set_bitrate_ = bitrate.target_bps(); + media_codec_->SetVideoBitrate(bitrate.target_bps(), framerate); } // Note: Android's MediaCodec doesn't allow mid-stream adjustments to // framerate, so we ignore that here. This is OK because Android only uses
diff --git a/media/gpu/gpu_video_encode_accelerator_helpers.cc b/media/gpu/gpu_video_encode_accelerator_helpers.cc index a33186d2..c731dff8 100644 --- a/media/gpu/gpu_video_encode_accelerator_helpers.cc +++ b/media/gpu/gpu_video_encode_accelerator_helpers.cc
@@ -158,7 +158,7 @@ const VideoEncodeAccelerator::Config& config) { if (config.spatial_layers.empty()) { return AllocateBitrateForDefaultEncodingWithBitrates( - {config.bitrate.target()}, + {config.bitrate.target_bps()}, /*num_temporal_layers=*/1u); }
diff --git a/media/gpu/gpu_video_encode_accelerator_helpers.h b/media/gpu/gpu_video_encode_accelerator_helpers.h index dc85811..79f9b8c 100644 --- a/media/gpu/gpu_video_encode_accelerator_helpers.h +++ b/media/gpu/gpu_video_encode_accelerator_helpers.h
@@ -37,7 +37,7 @@ // spatial layer (|config.spatial_layers[i].bitrate_bps| is distributed to // temporal layers in the spatial layer based on the same bitrate division ratio // as a software encoder. If |config.spatial_layers| is empty, -// VideoBitrateAllocation(0, 0) is set to |config.bitrate.target()| as it is +// VideoBitrateAllocation(0, 0) is set to |config.bitrate.target_bps()| as it is // a configuration with no layers. MEDIA_GPU_EXPORT VideoBitrateAllocation AllocateBitrateForDefaultEncoding(const VideoEncodeAccelerator::Config& config);
diff --git a/media/gpu/mac/vt_video_encode_accelerator_mac.cc b/media/gpu/mac/vt_video_encode_accelerator_mac.cc index d4a7065..de37b9fa 100644 --- a/media/gpu/mac/vt_video_encode_accelerator_mac.cc +++ b/media/gpu/mac/vt_video_encode_accelerator_mac.cc
@@ -370,8 +370,8 @@ switch (bitrate.mode()) { case Bitrate::Mode::kConstant: - if (bitrate.target() != static_cast<uint32_t>(target_bitrate_)) { - target_bitrate_ = bitrate.target(); + if (bitrate.target_bps() != static_cast<uint32_t>(target_bitrate_)) { + target_bitrate_ = bitrate.target_bps(); bitrate_adjuster_.SetTargetBitrateBps(target_bitrate_); SetAdjustedConstantBitrate(bitrate_adjuster_.GetAdjustedBitrateBps()); } @@ -412,10 +412,11 @@ compression_session_); [[maybe_unused]] bool rv = session_property_setter.Set(kVTCompressionPropertyKey_AverageBitRate, - static_cast<int32_t>(bitrate.target())); - rv &= session_property_setter.Set(kVTCompressionPropertyKey_DataRateLimits, - video_toolbox::ArrayWithIntegerAndFloat( - bitrate.peak() / kBitsPerByte, 1.0f)); + static_cast<int32_t>(bitrate.target_bps())); + rv &= + session_property_setter.Set(kVTCompressionPropertyKey_DataRateLimits, + video_toolbox::ArrayWithIntegerAndFloat( + bitrate.peak_bps() / kBitsPerByte, 1.0f)); DLOG_IF(ERROR, !rv) << "Couldn't change bitrate parameters of encode session."; }
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc index 46ac323..82ddde00 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -1475,19 +1475,21 @@ if (bitrate.mode() != Bitrate::Mode::kConstant) return; - if (current_bitrate_ == bitrate.target() && current_framerate_ == framerate) + if (current_bitrate_ == bitrate.target_bps() && + current_framerate_ == framerate) { return; - if (bitrate.target() == 0 || framerate == 0) + } + if (bitrate.target_bps() == 0 || framerate == 0) return; VLOGF(2) << "bitrate=" << bitrate.ToString() << ", framerate=" << framerate; DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_); TRACE_EVENT2("media,gpu", "V4L2VEA::RequestEncodingParametersChangeTask", "bitrate", bitrate.ToString(), "framerate", framerate); - if (current_bitrate_ != bitrate.target() && + if (current_bitrate_ != bitrate.target_bps() && !device_->SetExtCtrls( V4L2_CTRL_CLASS_MPEG, - {V4L2ExtCtrl(V4L2_CID_MPEG_VIDEO_BITRATE, bitrate.target())})) { + {V4L2ExtCtrl(V4L2_CID_MPEG_VIDEO_BITRATE, bitrate.target_bps())})) { VLOGF(1) << "Failed changing bitrate"; NOTIFY_ERROR(kPlatformFailureError); return; @@ -1504,7 +1506,7 @@ IOCTL_OR_ERROR_RETURN(VIDIOC_S_PARM, &parms); } - current_bitrate_ = bitrate.target(); + current_bitrate_ = bitrate.target_bps(); current_framerate_ = framerate; } @@ -1771,15 +1773,15 @@ // Check whether the h264 level is valid. if (!CheckH264LevelLimits(config.output_profile, h264_level, - config.bitrate.target(), framerate, + config.bitrate.target_bps(), framerate, framesize_in_mbs)) { absl::optional<uint8_t> valid_level = - FindValidH264Level(config.output_profile, config.bitrate.target(), + FindValidH264Level(config.output_profile, config.bitrate.target_bps(), framerate, framesize_in_mbs); if (!valid_level) { VLOGF(1) << "Could not find a valid h264 level for" << " profile=" << config.output_profile - << " bitrate=" << config.bitrate.target() + << " bitrate=" << config.bitrate.target_bps() << " framerate=" << framerate << " size=" << config.input_visible_size.ToString(); NOTIFY_ERROR(kInvalidArgumentError);
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc index 51deb95..211456d 100644 --- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc +++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
@@ -250,15 +250,15 @@ // Checks if |level_| is valid. If it is invalid, set |level_| to a minimum // level that comforts Table A-1 in H.264 spec with specified bitrate, // framerate and dimension. - if (!CheckH264LevelLimits(profile_, level_, config.bitrate.target(), + if (!CheckH264LevelLimits(profile_, level_, config.bitrate.target_bps(), initial_framerate, mb_width_ * mb_height_)) { absl::optional<uint8_t> valid_level = - FindValidH264Level(profile_, config.bitrate.target(), initial_framerate, - mb_width_ * mb_height_); + FindValidH264Level(profile_, config.bitrate.target_bps(), + initial_framerate, mb_width_ * mb_height_); if (!valid_level) { VLOGF(1) << "Could not find a valid h264 level for" << " profile=" << profile_ - << " bitrate=" << config.bitrate.target() + << " bitrate=" << config.bitrate.target_bps() << " framerate=" << initial_framerate << " size=" << config.input_visible_size.ToString(); return false;
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc index 94e4e657..f5882a4 100644 --- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc +++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
@@ -206,7 +206,7 @@ auto& sl = vea_config.spatial_layers[0]; sl.width = vea_config.input_visible_size.width(); sl.height = vea_config.input_visible_size.height(); - sl.bitrate_bps = vea_config.bitrate.target(); + sl.bitrate_bps = vea_config.bitrate.target_bps(); sl.framerate = vea_config.initial_framerate.value_or(30); sl.max_qp = 30; sl.num_of_temporal_layers = num_temporal_layers;
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index 6aa8af8..7ee653c 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -934,7 +934,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(child_sequence_checker_); VideoBitrateAllocation allocation; - allocation.SetBitrate(0, 0, bitrate.target()); + allocation.SetBitrate(0, 0, bitrate.target_bps()); encoder_task_runner_->PostTask( FROM_HERE, base::BindOnce(
diff --git a/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc index 930904c4..8581197 100644 --- a/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc +++ b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc
@@ -322,7 +322,7 @@ if (num_temporal_layers_ > 1) initial_bitrate_allocation = AllocateBitrateForDefaultEncoding(config); else - initial_bitrate_allocation.SetBitrate(0, 0, config.bitrate.target()); + initial_bitrate_allocation.SetBitrate(0, 0, config.bitrate.target_bps()); current_params_.max_qp = kMaxQPForSoftwareRateCtrl;
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc index 8b04523..f8665b5b 100644 --- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc +++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
@@ -354,7 +354,7 @@ auto initial_bitrate_allocation = AllocateDefaultBitrateForTesting( num_spatial_layers, num_temporal_layers, - kDefaultVideoEncodeAcceleratorConfig.bitrate.target()); + kDefaultVideoEncodeAcceleratorConfig.bitrate.target_bps()); std::vector<gfx::Size> svc_layer_size = GetDefaultSpatialLayerResolutions(num_spatial_layers); if (num_spatial_layers > 1u || num_temporal_layers > 1u) { @@ -375,13 +375,12 @@ } } - EXPECT_CALL( - *mock_rate_ctrl_, - UpdateRateControl(MatchRtcConfigWithRates( - AllocateDefaultBitrateForTesting( - num_spatial_layers, num_temporal_layers, config.bitrate.target()), - VideoEncodeAccelerator::kDefaultFramerate, num_temporal_layers, - svc_layer_size))) + EXPECT_CALL(*mock_rate_ctrl_, UpdateRateControl(MatchRtcConfigWithRates( + AllocateDefaultBitrateForTesting( + num_spatial_layers, num_temporal_layers, + config.bitrate.target_bps()), + VideoEncodeAccelerator::kDefaultFramerate, + num_temporal_layers, svc_layer_size))) .Times(1) .WillOnce(Return()); @@ -515,7 +514,7 @@ }; const uint32_t kBitrate = - kDefaultVideoEncodeAcceleratorConfig.bitrate.target(); + kDefaultVideoEncodeAcceleratorConfig.bitrate.target_bps(); const uint32_t kFramerate = *kDefaultVideoEncodeAcceleratorConfig.initial_framerate; const uint8_t* expected_temporal_ids = @@ -638,7 +637,7 @@ const VideoBitrateAllocation kDefaultBitrateAllocation = AllocateDefaultBitrateForTesting( num_spatial_layers, num_temporal_layers, - kDefaultVideoEncodeAcceleratorConfig.bitrate.target()); + kDefaultVideoEncodeAcceleratorConfig.bitrate.target_bps()); const std::vector<gfx::Size> kDefaultSpatialLayers = GetDefaultSpatialLayerResolutions(num_spatial_layers); const uint32_t kFramerate = @@ -668,7 +667,7 @@ const VideoBitrateAllocation kDefaultBitrateAllocation = AllocateDefaultBitrateForTesting( num_spatial_layers, num_temporal_layers, - kDefaultVideoEncodeAcceleratorConfig.bitrate.target()); + kDefaultVideoEncodeAcceleratorConfig.bitrate.target_bps()); std::vector<VideoBitrateAllocation> invalid_bitrate_allocations; constexpr uint32_t kBitrate = 1234u; auto bitrate_allocation = kDefaultBitrateAllocation;
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc index 61febee3..adb0061 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -734,7 +734,8 @@ hr = imf_output_media_type_->SetGUID(MF_MT_SUBTYPE, VideoCodecToMFSubtype(codec_)); RETURN_ON_HR_FAILURE(hr, "Couldn't set video format", false); - hr = imf_output_media_type_->SetUINT32(MF_MT_AVG_BITRATE, bitrate_.target()); + hr = imf_output_media_type_->SetUINT32(MF_MT_AVG_BITRATE, + bitrate_.target_bps()); RETURN_ON_HR_FAILURE(hr, "Couldn't set bitrate", false); hr = MFSetAttributeRatio(imf_output_media_type_.Get(), MF_MT_FRAME_RATE, frame_rate_, 1); @@ -816,14 +817,14 @@ } } - var.ulVal = bitrate_.target(); + var.ulVal = bitrate_.target_bps(); hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMeanBitRate, &var); if (!compatible_with_win7_) { RETURN_ON_HR_FAILURE(hr, "Couldn't set bitrate", false); } if (bitrate_.mode() == Bitrate::Mode::kVariable) { - var.ulVal = bitrate_.peak(); + var.ulVal = bitrate_.peak_bps(); hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMaxBitRate, &var); if (!compatible_with_win7_) { RETURN_ON_HR_FAILURE(hr, "Couldn't set bitrate", false); @@ -1434,7 +1435,7 @@ MF_MT_FRAME_RATE, framerate, 1); RETURN_ON_HR_FAILURE(hr, "Couldn't set frame rate for output type", ); - imf_output_media_type_->SetUINT32(MF_MT_AVG_BITRATE, bitrate.target()); + imf_output_media_type_->SetUINT32(MF_MT_AVG_BITRATE, bitrate.target_bps()); RETURN_ON_HR_FAILURE(hr, "Couldn't set average bitrate for output type", ); hr = MFSetAttributeRatio(imf_input_media_type_.Get(), MF_MT_FRAME_RATE, @@ -1488,14 +1489,14 @@ bitrate_ = bitrate; VARIANT var; var.vt = VT_UI4; - var.ulVal = bitrate.target(); + var.ulVal = bitrate.target_bps(); HRESULT hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMeanBitRate, &var); if (!compatible_with_win7_) { RETURN_ON_HR_FAILURE(hr, "Couldn't update mean bitrate", ); } if (bitrate.mode() == Bitrate::Mode::kVariable) { - var.ulVal = bitrate.peak(); + var.ulVal = bitrate.peak_bps(); hr = codec_api_->SetValue(&CODECAPI_AVEncCommonMaxBitRate, &var); if (!compatible_with_win7_) { RETURN_ON_HR_FAILURE(hr, "Couldn't set max bitrate", );
diff --git a/media/mojo/mojom/video_encode_accelerator.mojom b/media/mojo/mojom/video_encode_accelerator.mojom index a6abaca0..b118811 100644 --- a/media/mojo/mojom/video_encode_accelerator.mojom +++ b/media/mojo/mojom/video_encode_accelerator.mojom
@@ -75,14 +75,14 @@ // This defines a mojo transport format for a media::Bitrate of type kConstant. // The default target here matches that in media::Bitrate. struct ConstantBitrate { - uint32 target = 0; + uint32 target_bps = 0; }; // This defines a mojo transport format for a media::Bitrate of type kVariable. // The default target here matches that in media::Bitrate. struct VariableBitrate { - uint32 target = 0; - uint32 peak; + uint32 target_bps = 0; + uint32 peak_bps; }; // This defines a mojo transport format for media::Bitrate.
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc index 0eb6fb91..deff9d82 100644 --- a/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc +++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
@@ -332,7 +332,7 @@ bool StructTraits<media::mojom::ConstantBitrateDataView, media::Bitrate>::Read( media::mojom::ConstantBitrateDataView input, media::Bitrate* output) { - *output = media::Bitrate::ConstantBitrate(input.target()); + *output = media::Bitrate::ConstantBitrate(input.target_bps()); return true; } @@ -340,11 +340,12 @@ bool StructTraits<media::mojom::VariableBitrateDataView, media::Bitrate>::Read( media::mojom::VariableBitrateDataView input, media::Bitrate* output) { - if (input.target() > input.peak()) + if (input.target_bps() > input.peak_bps()) return false; - if (input.peak() == 0u) + if (input.peak_bps() == 0u) return false; - *output = media::Bitrate::VariableBitrate(input.target(), input.peak()); + *output = + media::Bitrate::VariableBitrate(input.target_bps(), input.peak_bps()); return true; } @@ -398,7 +399,7 @@ if (!input.ReadBitrate(&bitrate)) return false; DCHECK((bitrate.mode() == media::Bitrate::Mode::kConstant) == - (bitrate.peak() == 0u)); + (bitrate.peak_bps() == 0u)); absl::optional<uint32_t> initial_framerate; if (input.has_initial_framerate())
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits.h b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h index a2b7662..21f74c4 100644 --- a/media/mojo/mojom/video_encode_accelerator_mojom_traits.h +++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
@@ -326,7 +326,9 @@ template <> struct StructTraits<media::mojom::ConstantBitrateDataView, media::Bitrate> { - static uint32_t target(const media::Bitrate& input) { return input.target(); } + static uint32_t target_bps(const media::Bitrate& input) { + return input.target_bps(); + } static bool Read(media::mojom::ConstantBitrateDataView input, media::Bitrate* output); @@ -334,8 +336,12 @@ template <> struct StructTraits<media::mojom::VariableBitrateDataView, media::Bitrate> { - static uint32_t target(const media::Bitrate& input) { return input.target(); } - static uint32_t peak(const media::Bitrate& input) { return input.peak(); } + static uint32_t target_bps(const media::Bitrate& input) { + return input.target_bps(); + } + static uint32_t peak_bps(const media::Bitrate& input) { + return input.peak_bps(); + } static bool Read(media::mojom::VariableBitrateDataView input, media::Bitrate* output); };
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc index 37c9bb1..3932f6c 100644 --- a/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc +++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
@@ -120,8 +120,8 @@ TEST(VariableBitrateStructTraitTest, PeakZeroBps_Rejected) { mojom::VariableBitratePtr mojom_variable_bitrate = mojom::VariableBitrate::New(); - mojom_variable_bitrate->target = 0u; - mojom_variable_bitrate->peak = 0u; + mojom_variable_bitrate->target_bps = 0u; + mojom_variable_bitrate->peak_bps = 0u; Bitrate output; bool result = mojo::test::SerializeAndDeserialize<mojom::VariableBitrate>( @@ -132,8 +132,8 @@ TEST(VariableBitrateStructTraitTest, PeakLessThanTarget_Rejected) { mojom::VariableBitratePtr mojom_variable_bitrate = mojom::VariableBitrate::New(); - mojom_variable_bitrate->target = 6000u; - mojom_variable_bitrate->peak = 5999u; + mojom_variable_bitrate->target_bps = 6000u; + mojom_variable_bitrate->peak_bps = 5999u; Bitrate output; bool result = mojo::test::SerializeAndDeserialize<mojom::VariableBitrate>(
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc index 6d81cc88..c5eade6 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -198,7 +198,7 @@ if (!encoder_) return; - DVLOG(2) << __func__ << " bitrate=" << bitrate.target() + DVLOG(2) << __func__ << " bitrate=" << bitrate.target_bps() << " framerate=" << framerate; encoder_->RequestEncodingParametersChange(bitrate, framerate);
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc index fdea063..368e7a4 100644 --- a/media/video/av1_video_encoder.cc +++ b/media/video/av1_video_encoder.cc
@@ -96,7 +96,7 @@ if (opts.bitrate.has_value()) { auto& bitrate = opts.bitrate.value(); - config.rc_target_bitrate = bitrate.target() / 1000; + config.rc_target_bitrate = bitrate.target_bps() / 1000; switch (bitrate.mode()) { case Bitrate::Mode::kVariable: config.rc_end_usage = AOM_VBR;
diff --git a/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc index afb348e..92f45f7f 100644 --- a/media/video/openh264_video_encoder.cc +++ b/media/video/openh264_video_encoder.cc
@@ -41,7 +41,7 @@ if (options.bitrate.has_value()) { auto& bitrate = options.bitrate.value(); params->iRCMode = RC_BITRATE_MODE; - params->iTargetBitrate = base::saturated_cast<int>(bitrate.target()); + params->iTargetBitrate = base::saturated_cast<int>(bitrate.target_bps()); } else { params->iRCMode = RC_OFF_MODE; }
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc index 649312b4..e973758b 100644 --- a/media/video/video_encode_accelerator_adapter.cc +++ b/media/video/video_encode_accelerator_adapter.cc
@@ -77,7 +77,7 @@ VideoEncodeAccelerator::Config::SpatialLayer layer; layer.width = opts.frame_size.width(); layer.height = opts.frame_size.height(); - layer.bitrate_bps = config.bitrate.target(); + layer.bitrate_bps = config.bitrate.target_bps(); if (initial_framerate.has_value()) layer.framerate = initial_framerate.value(); layer.num_of_temporal_layers = num_temporal_layers;
diff --git a/media/video/vpx_video_encoder.cc b/media/video/vpx_video_encoder.cc index 324e2f4..5397f6a 100644 --- a/media/video/vpx_video_encoder.cc +++ b/media/video/vpx_video_encoder.cc
@@ -113,7 +113,7 @@ if (opts.bitrate.has_value()) { auto& bitrate = opts.bitrate.value(); - config->rc_target_bitrate = bitrate.target() / 1000; + config->rc_target_bitrate = bitrate.target_bps() / 1000; switch (bitrate.mode()) { case Bitrate::Mode::kVariable: config->rc_end_usage = VPX_VBR;
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h index 4f00e42..9c5b91f 100644 --- a/net/base/net_error_list.h +++ b/net/base/net_error_list.h
@@ -806,6 +806,9 @@ // processed and is therefore safe to retry on a different connection. NET_ERROR(QUIC_GOAWAY_REQUEST_CAN_BE_RETRIED, -381) +// The ACCEPT_CH restart has been triggered too many times +NET_ERROR(TOO_MANY_ACCEPT_CH_RESTARTS, -382) + // The cache does not have the requested entry. NET_ERROR(CACHE_MISS, -400)
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc index 1d1b3d8e..205ae9da 100644 --- a/net/cert/multi_threaded_cert_verifier.cc +++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -235,6 +235,7 @@ } void MultiThreadedCertVerifier::SetConfig(const CertVerifier::Config& config) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); LOG_IF(DFATAL, verify_proc_ && !verify_proc_->SupportsAdditionalTrustAnchors() && !config.additional_trust_anchors.empty())
diff --git a/net/test/cert_builder.cc b/net/test/cert_builder.cc index 056f1c59..c63ac38 100644 --- a/net/test/cert_builder.cc +++ b/net/test/cert_builder.cc
@@ -134,6 +134,24 @@ return CertBuilder::FromStaticCert(cert->cert_buffer(), private_key.get()); } +// static +std::unique_ptr<CertBuilder> CertBuilder::FromSubjectPublicKeyInfo( + base::span<const uint8_t> spki_der, + CertBuilder* issuer) { + DCHECK(issuer); + auto builder = std::make_unique<CertBuilder>(/*orig_cert=*/nullptr, issuer); + + CBS cbs; + CBS_init(&cbs, spki_der.data(), spki_der.size()); + builder->key_ = bssl::UniquePtr<EVP_PKEY>(EVP_parse_public_key(&cbs)); + // Check that there was no error in `EVP_parse_public_key` and that it + // consumed the entire public key. + if (!builder->key_ || (CBS_len(&cbs) != 0)) + return nullptr; + + return builder; +} + CertBuilder::~CertBuilder() = default; // static
diff --git a/net/test/cert_builder.h b/net/test/cert_builder.h index 8efb8b5..0484817 100644 --- a/net/test/cert_builder.h +++ b/net/test/cert_builder.h
@@ -54,6 +54,14 @@ const base::FilePath& cert_and_key_file, CertBuilder* issuer); + // Initializes a CertBuilder that will return a certificate for the provided + // public key |spki_der|. It will be signed with the |issuer|, this builder + // will not have a private key, so it cannot produce self-signed certificates + // and |issuer| cannot be null. + static std::unique_ptr<CertBuilder> FromSubjectPublicKeyInfo( + base::span<const uint8_t> spki_der, + CertBuilder* issuer); + // Creates a CertBuilder that will return a static |cert| and |key|. // This may be passed as the |issuer| param of another CertBuilder to create // a cert chain that ends in a pre-defined certificate.
diff --git a/pdf/pdf_view_plugin_base.h b/pdf/pdf_view_plugin_base.h index 4a5384a..5d28ea3 100644 --- a/pdf/pdf_view_plugin_base.h +++ b/pdf/pdf_view_plugin_base.h
@@ -87,7 +87,7 @@ kFailed, }; - // Must match `SaveRequestType` in chrome/browser/resources/pdf/constants.js. + // Must match `SaveRequestType` in chrome/browser/resources/pdf/constants.ts. enum class SaveRequestType { kAnnotation = 0, kOriginal = 1,
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc index 2e666cc..e8fe71c3 100644 --- a/services/network/public/cpp/features.cc +++ b/services/network/public/cpp/features.cc
@@ -220,6 +220,12 @@ // static uint32_t GetDataPipeDefaultAllocationSize(DataPipeAllocationSize option) { +#if BUILDFLAG(IS_CHROMEOS) + // TODO(crbug.com/1260751): It is unclear if the increased data pipe size + // is responsible for an increased CrOS crash rate, so the size is being + // reverted to the default while we investigate. + return kDefaultDataPipeAllocationSize; +#else // For low-memory devices, always use the (smaller) default buffer size. if (base::SysInfo::AmountOfPhysicalMemoryMB() <= 512) return kDefaultDataPipeAllocationSize; @@ -229,6 +235,7 @@ case DataPipeAllocationSize::kLargerSizeIfPossible: return kLargerDataPipeAllocationSize; } +#endif } // static
diff --git a/services/tracing/public/cpp/stack_sampling/stack_sampler_android.cc b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.cc index 2d4de082..a16f0fe 100644 --- a/services/tracing/public/cpp/stack_sampling/stack_sampler_android.cc +++ b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.cc
@@ -27,7 +27,8 @@ void StackSamplerAndroid::RecordStackFrames( base::StackBuffer* stack_buffer, - base::ProfileBuilder* profile_builder) { + base::ProfileBuilder* profile_builder, + base::PlatformThreadId thread_id) { if (!unwinder_.is_initialized()) { // May block on disk access. This function is executed on the profiler // thread, so this will only block profiling execution.
diff --git a/services/tracing/public/cpp/stack_sampling/stack_sampler_android.h b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.h index 02b10262..f33e00e 100644 --- a/services/tracing/public/cpp/stack_sampling/stack_sampler_android.h +++ b/services/tracing/public/cpp/stack_sampling/stack_sampler_android.h
@@ -31,7 +31,8 @@ // StackSampler: void AddAuxUnwinder(std::unique_ptr<base::Unwinder> unwinder) override; void RecordStackFrames(base::StackBuffer* stack_buffer, - base::ProfileBuilder* profile_builder) override; + base::ProfileBuilder* profile_builder, + base::PlatformThreadId thread_id) override; private: base::SamplingProfilerThreadToken thread_token_;
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc index cc58f4f5..ca843b55 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -768,7 +768,7 @@ #elif ANDROID_CFI_UNWINDING_SUPPORTED auto* module_cache = profile_builder->GetModuleCache(); profiler_ = std::make_unique<base::StackSamplingProfiler>( - params, std::move(profile_builder), + sampled_thread_token_, params, std::move(profile_builder), std::make_unique<StackSamplerAndroid>(sampled_thread_token_, module_cache)); profiler_->Start();
diff --git a/testing/PRESUBMIT.py b/testing/PRESUBMIT.py index 7ba136f..7d4e79a 100644 --- a/testing/PRESUBMIT.py +++ b/testing/PRESUBMIT.py
@@ -34,12 +34,13 @@ output.extend(input_api.canned_checks.RunPylint( input_api, output_api, - files_to_skip=[r'gmock.*', r'gtest.*', r'trigger_scripts.*'])) + files_to_skip=[r'gmock.*', r'gtest.*', + r'buildbot.*', r'trigger_scripts.*'])) # Pylint2.7 is run on subdirs whose presubmit checks are migrated to Python3 output.extend(input_api.canned_checks.RunPylint( input_api, output_api, - files_to_check=[r'trigger_scripts.*\.py$'], + files_to_check=[r'buildbot.*\.py$', r'trigger_scripts.*\.py$'], version='2.7')) return output
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 53f2064..dcf1c33 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5796,7 +5796,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -5804,14 +5804,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "dimension_sets": [ @@ -5938,7 +5938,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -5946,14 +5946,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index cc3a390..e37c9c3 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -4869,6 +4869,16 @@ } ] }, + "Win ASan Release (reclient shadow)": { + "additional_compile_targets": [ + "chromium_builder_asan" + ] + }, + "Win ASan Release Media (reclient shadow)": { + "additional_compile_targets": [ + "chromium_builder_asan" + ] + }, "Win x64 Builder (reclient compare)": { "additional_compile_targets": [ "pdf_fuzzers" @@ -85831,7 +85841,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -85839,14 +85849,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -85948,7 +85958,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -85956,14 +85966,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -87330,21 +87340,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "dimension_sets": [ @@ -87472,21 +87482,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "dimension_sets": [ @@ -89027,21 +89037,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "dimension_sets": [ @@ -89169,21 +89179,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "dimension_sets": [ @@ -89920,21 +89930,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -90016,21 +90026,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4919.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4920.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v101.0.4919.0", - "revision": "version:101.0.4919.0" + "location": "lacros_version_skew_tests_v101.0.4920.0", + "revision": "version:101.0.4920.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py index d229a27..b0a555c 100755 --- a/testing/buildbot/generate_buildbot_json.py +++ b/testing/buildbot/generate_buildbot_json.py
@@ -17,11 +17,14 @@ import itertools import json import os +import six import string import sys import buildbot_json_magic_substitutions as magic_substitutions +# pylint: disable=super-with-arguments,useless-super-delegation + THIS_DIR = os.path.dirname(os.path.abspath(__file__)) BROWSER_CONFIG_TO_TARGET_SUFFIX_MAP = { @@ -41,11 +44,11 @@ # chromium.android.fyi which run certain tests as instrumentation # tests, but not as gtests. If this discrepancy were fixed then the # notion could be removed. -class TestSuiteTypes(object): +class TestSuiteTypes(object): # pylint: disable=useless-object-inheritance GTEST = 'gtest' -class BaseGenerator(object): +class BaseGenerator(object): # pylint: disable=useless-object-inheritance def __init__(self, bb_gen): self.bb_gen = bb_gen @@ -77,7 +80,6 @@ class GPUTelemetryTestGenerator(BaseGenerator): - def __init__(self, bb_gen, is_android_webview=False): super(GPUTelemetryTestGenerator, self).__init__(bb_gen) self._is_android_webview = is_android_webview @@ -266,7 +268,7 @@ 'compound suite %s, %s' % (suite, sub_suite)) -class BBJSONGenerator(object): +class BBJSONGenerator(object): # pylint: disable=useless-object-inheritance def __init__(self, args): self.this_dir = THIS_DIR self.args = args @@ -382,13 +384,16 @@ return os.path.join(self.args.pyl_files_dir, filename) return filename + # pylint: disable=inconsistent-return-statements def load_pyl_file(self, filename): try: return ast.literal_eval(self.read_file( self.pyl_file_path(filename))) except (SyntaxError, ValueError) as e: # pragma: no cover - raise BBGenErr('Failed to parse pyl file "%s": %s' % - (filename, e)) # pragma: no cover + six.raise_from( + BBGenErr('Failed to parse pyl file "%s": %s' % (filename, e)), + e) # pragma: no cover + # pylint: enable=inconsistent-return-statements # TOOD(kbr): require that os_type be specified for all bots in waterfalls.pyl. # Currently it is only mandatory for bots which run GPU tests. Change these to @@ -426,8 +431,7 @@ # the "test_name", which is actually the "test" field. if 'name' in test_config: return self.exceptions.get(test_config['name']) - else: - return self.exceptions.get(test_name) + return self.exceptions.get(test_name) def should_run_on_tester(self, waterfall, tester_name,test_name, test_config): # Currently, the only reason a test should not run on a given tester is that @@ -565,11 +569,12 @@ a[key][idx] = self.dictionary_merge(a[key][idx], b[key][idx], path + [str(key), str(idx)], update=update) - except (IndexError, TypeError): - raise BBGenErr('Error merging lists by key "%s" from source %s ' - 'into target %s at index %s. Verify target list ' - 'length is equal or greater than source' - % (str(key), str(b), str(a), str(idx))) + except (IndexError, TypeError) as e: + six.raise_from( + BBGenErr('Error merging lists by key "%s" from source %s ' + 'into target %s at index %s. Verify target list ' + 'length is equal or greater than source' % + (str(key), str(b), str(a), str(idx))), e) elif update: if b[key] is None: del a[key] @@ -700,7 +705,7 @@ else: test[key][i+1] = replacement_val break - elif test_key.startswith(replacement_key + '='): + if test_key.startswith(replacement_key + '='): found_key = True if replacement_val == None: del test[key][i] @@ -1000,10 +1005,9 @@ return ( 'telemetry_gpu_integration_test' + BROWSER_CONFIG_TO_TARGET_SUFFIX_MAP[tester_config['browser_config']]) - elif self.is_fuchsia(tester_config): + if self.is_fuchsia(tester_config): return 'telemetry_gpu_integration_test_fuchsia' - else: - return 'telemetry_gpu_integration_test' + return 'telemetry_gpu_integration_test' def get_test_generator_map(self): return { @@ -1893,10 +1897,10 @@ self.type_assert(value, ast.List, filename, verbose) keys = [] - for val in value.elts: - self.type_assert(val, ast.Dict, filename, verbose) + for elm in value.elts: + self.type_assert(elm, ast.Dict, filename, verbose) waterfall_name = None - for key, val in zip(val.keys, val.values): + for key, val in zip(elm.keys, elm.values): self.type_assert(key, ast.Str, filename, verbose) if key.s == 'machines': if not self.check_ast_dict_formatted(val, filename, verbose): @@ -1932,7 +1936,7 @@ assert all(key in expected_keys for key in actual_keys), ( 'Invalid %r file; expected keys %r, got %r' % ( filename, expected_keys, actual_keys)) - suite_dicts = [node for node in value.values] + suite_dicts = list(value.values) # Only two keys should mean only 1 or 2 values assert len(suite_dicts) <= 3 for suite_group in suite_dicts: @@ -2211,8 +2215,8 @@ self.write_file(json_file, output) else: self.print_line(output) - return + # pylint: disable=inconsistent-return-statements def query(self, args): """Queries tests or bots. @@ -2235,12 +2239,11 @@ if len(query) == 1: return self.output_query_result(bots, args.json) # query with specific parameters - elif len(query) == 2: + if len(query) == 2: if query[1] == 'tests': test_suites_dict = self.get_test_suites_dict(bots) return self.output_query_result(test_suites_dict, args.json) - else: - self.error_msg("This query should be in the format: bots/tests.") + self.error_msg("This query should be in the format: bots/tests.") else: self.error_msg("This query should have 0 or 1 '/', found %s instead." @@ -2300,6 +2303,7 @@ else: self.error_msg("Your command did not match any valid commands." + "Try starting with 'bots', 'bot', 'tests', or 'test'.") + # pylint: enable=inconsistent-return-statements def main(self): # pragma: no cover if self.args.check:
diff --git a/testing/buildbot/generate_buildbot_json_coveragetest.py b/testing/buildbot/generate_buildbot_json_coveragetest.py index aac608f..fa4cb1d 100755 --- a/testing/buildbot/generate_buildbot_json_coveragetest.py +++ b/testing/buildbot/generate_buildbot_json_coveragetest.py
@@ -8,7 +8,8 @@ import sys import unittest -class FakeStream(object): + +class FakeStream(object): # pylint: disable=useless-object-inheritance def write(self, value): pass @@ -18,7 +19,9 @@ def main(): cov = coverage.coverage(include='*generate_buildbot_json.py') cov.start() + # pylint: disable=import-outside-toplevel import generate_buildbot_json_unittest + # pylint: enable=import-outside-toplevel suite = unittest.TestLoader().loadTestsFromModule( generate_buildbot_json_unittest) unittest.TextTestRunner(stream=FakeStream()).run(suite)
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py index 155befcc..41cdc2a 100755 --- a/testing/buildbot/generate_buildbot_json_unittest.py +++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -14,6 +14,8 @@ import generate_buildbot_json from pyfakefs import fake_filesystem_unittest +# pylint: disable=super-with-arguments + EMPTY_PYL_FILE = """\ { } @@ -96,7 +98,7 @@ def check_output_file_consistency(self, verbose=False, dump=True): with dump_on_failure(self, dump=verbose and dump): super(FakeBBGen, self).check_output_file_consistency(verbose) -# pragma pylint: enable=arguments-differ + # pragma pylint: enable=arguments-differ FOO_GTESTS_WATERFALL = """\
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py index 9c74013a..bf9daf0 100755 --- a/testing/buildbot/manage.py +++ b/testing/buildbot/manage.py
@@ -15,6 +15,7 @@ import glob import json import os +import six import subprocess import sys @@ -254,7 +255,8 @@ try: config = json.loads(content) except ValueError as e: - raise Error('Exception raised while checking %s: %s' % (filepath, e)) + six.raise_from( + Error('Exception raised while checking %s: %s' % (filepath, e)), e) for builder, data in sorted(config.items()): if builder in SKIP: @@ -274,7 +276,7 @@ test not in SKIP_GN_ISOLATE_MAP_TARGETS): raise Error('%s: %s / %s is not listed in gn_isolate_map.pyl' % (filename, builder, test)) - elif test in ninja_targets: + if test in ninja_targets: ninja_targets_seen.add(test) for target in data.get('additional_compile_targets', []): @@ -282,7 +284,7 @@ target not in SKIP_GN_ISOLATE_MAP_TARGETS): raise Error('%s: %s / %s is not listed in gn_isolate_map.pyl' % (filename, builder, target)) - elif target in ninja_targets: + if target in ninja_targets: ninja_targets_seen.add(target) gtest_tests = data.get('gtest_tests', []) @@ -300,7 +302,7 @@ test not in SKIP_GN_ISOLATE_MAP_TARGETS): raise Error('%s: %s / %s is not listed in gn_isolate_map.pyl.' % (filename, builder, test)) - elif test in ninja_targets: + if test in ninja_targets: ninja_targets_seen.add(test) name = d.get('name', d['test']) @@ -321,7 +323,7 @@ name not in SKIP_GN_ISOLATE_MAP_TARGETS): raise Error('%s: %s / %s is not listed in gn_isolate_map.pyl.' % (filename, builder, name)) - elif name in ninja_targets: + if name in ninja_targets: ninja_targets_seen.add(name) for d in data.get('instrumentation_tests', []): @@ -330,7 +332,7 @@ name not in SKIP_GN_ISOLATE_MAP_TARGETS): raise Error('%s: %s / %s is not listed in gn_isolate_map.pyl.' % (filename, builder, name)) - elif name in ninja_targets: + if name in ninja_targets: ninja_targets_seen.add(name) # The trick here is that process_builder_remaining() is called before @@ -415,10 +417,12 @@ total = total_local + total_swarming p_local = 100. * total_local / total p_swarming = 100. * total_swarming / total + # pylint: disable=bad-string-format-type print('%s%-*s %4d (%4.1f%%) %4d (%4.1f%%)' % (colorama.Fore.WHITE, l, 'Total:', total_local, p_local, total_swarming, p_swarming)) print('%-*s %4d' % (l, 'Total executions:', total)) + #pylint: enable=bad-string-format-type def main():
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index fa21a4db..5d661b92 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -28,16 +28,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4919.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v101.0.4920.0/test_ash_chrome', '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter', ], - 'identifier': 'Lacros version skew testing ash 101.0.4919.0', + 'identifier': 'Lacros version skew testing ash 101.0.4920.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v101.0.4919.0', - 'revision': 'version:101.0.4919.0', + 'location': 'lacros_version_skew_tests_v101.0.4920.0', + 'revision': 'version:101.0.4920.0', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 0c7feff..73d61c47 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2739,6 +2739,16 @@ }, 'use_swarming': False, }, + 'Win ASan Release (reclient shadow)': { + 'additional_compile_targets': [ + 'chromium_builder_asan', + ], + }, + 'Win ASan Release Media (reclient shadow)': { + 'additional_compile_targets': [ + 'chromium_builder_asan', + ], + }, 'Win x64 Builder (reclient compare)': { # Copied from # https://source.chromium.org/chromium/chromium/src/+/7b147a6777cb32d6a12e1716c61a0ed50dc1229a:testing/buildbot/waterfalls.pyl;l=6023-6030
diff --git a/testing/gtest_ios/OWNERS b/testing/gtest_ios/OWNERS new file mode 100644 index 0000000..61f92e5 --- /dev/null +++ b/testing/gtest_ios/OWNERS
@@ -0,0 +1 @@ +file://infra/config/groups/ios/OWNERS
diff --git a/testing/gtest_ios/unittest-Info.plist b/testing/gtest_ios/unittest-Info.plist index 6f7037b..f2a2035 100644 --- a/testing/gtest_ios/unittest-Info.plist +++ b/testing/gtest_ios/unittest-Info.plist
@@ -51,6 +51,10 @@ <key>NSAllowsArbitraryLoads</key> <true/> </dict> + <key>NSCameraUsageDescription</key> + <string>This test needs to request access to your camera.</string> + <key>NSMicrophoneUsageDescription</key> + <string>This test needs to request access to your microphone.</string> <key>UIFileSharingEnabled</key> <true/> <key>UILaunchImages</key>
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 7b89e48..f955a3b9 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -185,21 +185,6 @@ ] } ], - "AndroidMessagesPWAInstall": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "InstallableAmbientBadgeMessage" - ] - } - ] - } - ], "AndroidMessagesSaveCard": [ { "platforms": [ @@ -4015,6 +4000,31 @@ ] } ], + "MaxUnthrottledTimeoutNestingLevel": [ + { + "platforms": [ + "android", + "android_weblayer", + "android_webview", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "nesting": "100" + }, + "enable_features": [ + "MaxUnthrottledTimeoutNestingLevel" + ] + } + ] + } + ], "MediaFoundationD3D11VideoCapture": [ { "platforms": [
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn index c9430e9..ae9564a 100644 --- a/third_party/android_deps/BUILD.gn +++ b/third_party/android_deps/BUILD.gn
@@ -225,7 +225,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("com_google_errorprone_error_prone_annotations_java") { - jar_path = "libs/com_google_errorprone_error_prone_annotations/error_prone_annotations-2.10.0.jar" + jar_path = "libs/com_google_errorprone_error_prone_annotations/error_prone_annotations-2.9.0.jar" output_name = "com_google_errorprone_error_prone_annotations" supports_android = true @@ -374,14 +374,14 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_ow2_asm_asm_java") { - jar_path = "libs/org_ow2_asm_asm/asm-9.0.jar" + jar_path = "libs/org_ow2_asm_asm/asm-9.2.jar" output_name = "org_ow2_asm_asm" enable_bytecode_checks = false } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_ow2_asm_asm_commons_java") { - jar_path = "libs/org_ow2_asm_asm_commons/asm-commons-9.0.jar" + jar_path = "libs/org_ow2_asm_asm_commons/asm-commons-9.2.jar" output_name = "org_ow2_asm_asm_commons" enable_bytecode_checks = false deps = [ @@ -393,7 +393,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_ow2_asm_asm_tree_java") { - jar_path = "libs/org_ow2_asm_asm_tree/asm-tree-9.0.jar" + jar_path = "libs/org_ow2_asm_asm_tree/asm-tree-9.2.jar" output_name = "org_ow2_asm_asm_tree" enable_bytecode_checks = false deps = [ ":org_ow2_asm_asm_java" ] @@ -401,7 +401,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_ow2_asm_asm_util_java") { - jar_path = "libs/org_ow2_asm_asm_util/asm-util-9.0.jar" + jar_path = "libs/org_ow2_asm_asm_util/asm-util-9.2.jar" output_name = "org_ow2_asm_asm_util" enable_bytecode_checks = false deps = [ @@ -712,7 +712,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_ow2_asm_asm_analysis_java") { - jar_path = "libs/org_ow2_asm_asm_analysis/asm-analysis-9.0.jar" + jar_path = "libs/org_ow2_asm_asm_analysis/asm-analysis-9.2.jar" output_name = "org_ow2_asm_asm_analysis" enable_bytecode_checks = false @@ -1441,7 +1441,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_robolectric_java") { - jar_path = "libs/org_robolectric_robolectric/robolectric-4.6.1.jar" + jar_path = "libs/org_robolectric_robolectric/robolectric-4.7.3.jar" output_name = "org_robolectric_robolectric" enable_bytecode_checks = false testonly = true @@ -1466,7 +1466,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_shadows_multidex_java") { jar_path = - "libs/org_robolectric_shadows_multidex/shadows-multidex-4.6.1.jar" + "libs/org_robolectric_shadows_multidex/shadows-multidex-4.7.3.jar" output_name = "org_robolectric_shadows_multidex" enable_bytecode_checks = false testonly = true @@ -1481,7 +1481,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_shadows_playservices_java") { - jar_path = "libs/org_robolectric_shadows_playservices/shadows-playservices-4.6.1.jar" + jar_path = "libs/org_robolectric_shadows_playservices/shadows-playservices-4.7.3.jar" output_name = "org_robolectric_shadows_playservices" enable_bytecode_checks = false testonly = true @@ -1494,11 +1494,12 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_utils_java") { - jar_path = "libs/org_robolectric_utils/utils-4.6.1.jar" + jar_path = "libs/org_robolectric_utils/utils-4.7.3.jar" output_name = "org_robolectric_utils" enable_bytecode_checks = false testonly = true deps = [ + ":com_google_errorprone_error_prone_annotations_java", ":com_google_guava_guava_java", ":javax_annotation_javax_annotation_api_java", ":javax_inject_javax_inject_java", @@ -2171,7 +2172,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_annotations_java") { - jar_path = "libs/org_robolectric_annotations/annotations-4.6.1.jar" + jar_path = "libs/org_robolectric_annotations/annotations-4.7.3.jar" output_name = "org_robolectric_annotations" enable_bytecode_checks = false @@ -2187,7 +2188,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_junit_java") { - jar_path = "libs/org_robolectric_junit/junit-4.6.1.jar" + jar_path = "libs/org_robolectric_junit/junit-4.7.3.jar" output_name = "org_robolectric_junit" enable_bytecode_checks = false @@ -2209,8 +2210,25 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + java_prebuilt("org_robolectric_nativeruntime_java") { + jar_path = "libs/org_robolectric_nativeruntime/nativeruntime-4.7.3.jar" + output_name = "org_robolectric_nativeruntime" + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + testonly = true + deps = [ ":com_google_guava_guava_java" ] + bypass_platform_checks = true + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_pluginapi_java") { - jar_path = "libs/org_robolectric_pluginapi/pluginapi-4.6.1.jar" + jar_path = "libs/org_robolectric_pluginapi/pluginapi-4.7.3.jar" output_name = "org_robolectric_pluginapi" enable_bytecode_checks = false @@ -2227,7 +2245,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_plugins_maven_dependency_resolver_java") { - jar_path = "libs/org_robolectric_plugins_maven_dependency_resolver/plugins-maven-dependency-resolver-4.6.1.jar" + jar_path = "libs/org_robolectric_plugins_maven_dependency_resolver/plugins-maven-dependency-resolver-4.7.3.jar" output_name = "org_robolectric_plugins_maven_dependency_resolver" enable_bytecode_checks = false @@ -2248,7 +2266,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_resources_java") { - jar_path = "libs/org_robolectric_resources/resources-4.6.1.jar" + jar_path = "libs/org_robolectric_resources/resources-4.7.3.jar" output_name = "org_robolectric_resources" enable_bytecode_checks = false @@ -2270,7 +2288,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_sandbox_java") { - jar_path = "libs/org_robolectric_sandbox/sandbox-4.6.1.jar" + jar_path = "libs/org_robolectric_sandbox/sandbox-4.7.3.jar" output_name = "org_robolectric_sandbox" enable_bytecode_checks = false @@ -2297,7 +2315,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_shadowapi_java") { - jar_path = "libs/org_robolectric_shadowapi/shadowapi-4.6.1.jar" + jar_path = "libs/org_robolectric_shadowapi/shadowapi-4.7.3.jar" output_name = "org_robolectric_shadowapi" enable_bytecode_checks = false @@ -2318,7 +2336,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_shadows_framework_java") { jar_path = - "libs/org_robolectric_shadows_framework/shadows-framework-4.6.1.jar" + "libs/org_robolectric_shadows_framework/shadows-framework-4.7.3.jar" output_name = "org_robolectric_shadows_framework" enable_bytecode_checks = false @@ -2331,7 +2349,9 @@ testonly = true deps = [ ":com_google_auto_value_auto_value_annotations_java", + ":com_google_errorprone_error_prone_annotations_java", ":org_robolectric_annotations_java", + ":org_robolectric_nativeruntime_java", ":org_robolectric_pluginapi_java", ":org_robolectric_resources_java", ":org_robolectric_shadowapi_java", @@ -2347,7 +2367,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_robolectric_utils_reflector_java") { - jar_path = "libs/org_robolectric_utils_reflector/utils-reflector-4.6.1.jar" + jar_path = "libs/org_robolectric_utils_reflector/utils-reflector-4.7.3.jar" output_name = "org_robolectric_utils_reflector" enable_bytecode_checks = false
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 3cf7cf9..3d05fb2 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -225,7 +225,7 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::FeatureParam<int> kSharedStorageURLSelectionOperationInputURLSizeLimit{ - &kSharedStorageAPI, "url_selection_operation_input_url_size_limit", 5}; + &kSharedStorageAPI, "url_selection_operation_input_url_size_limit", 8}; const base::FeatureParam<int> kMaxSharedStorageStringLength = { &kSharedStorageAPI, "MaxSharedStorageStringLength", 1024}; const base::FeatureParam<int> kMaxSharedStorageEntriesPerOrigin = { @@ -285,6 +285,11 @@ blink::features::FencedFramesImplementationType::kMPArch; } +bool IsFencedFramesShadowDOMBased() { + return blink::features::kFencedFramesImplementationTypeParam.Get() == + blink::features::FencedFramesImplementationType::kShadowDOM; +} + const base::Feature kInitialNavigationEntry{"InitialNavigationEntry", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 0ec9f166..8343142 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -138,6 +138,7 @@ // Fenced Frames: BLINK_COMMON_EXPORT bool IsFencedFramesEnabled(); BLINK_COMMON_EXPORT bool IsFencedFramesMPArchBased(); +BLINK_COMMON_EXPORT bool IsFencedFramesShadowDOMBased(); // Whether we will create initial NavigationEntry or not on FrameTree creation, // which also impacts the session history replacement decisions made in the
diff --git a/third_party/blink/public/mojom/webid/federated_auth_request.mojom b/third_party/blink/public/mojom/webid/federated_auth_request.mojom index 6b25158..08c4c67d 100644 --- a/third_party/blink/public/mojom/webid/federated_auth_request.mojom +++ b/third_party/blink/public/mojom/webid/federated_auth_request.mojom
@@ -36,11 +36,6 @@ kError }; -enum RequestMode { - kMediated, - kPermission, -}; - // The details of a single logout request from an identity provider. struct LogoutRpsRequest { // URL to which the request will be sent. The origin is validated to @@ -57,15 +52,13 @@ // This interface is called from a renderer process and implemented in the // browser process. interface FederatedAuthRequest { - // Requests an IdToken to be generated, given an IDP URL, some request - // parameters, and a mode that specifies the UI flow. + // Requests an IdToken to be generated, given an IDP URL. // |client_id| and |nonce| can be empty strings to omit the fields in the // request sent to the provider. // Returns the raw content of the IdToken. RequestIdToken(url.mojom.Url provider, string client_id, string nonce, - RequestMode mode, bool prefer_auto_sign_in) => (RequestIdTokenStatus status, string? id_token);
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index b42975ba..aa57f80 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -25,6 +25,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_element_form_disabled_callback.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_element_form_state_restore_callback.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_element_form_state_restore_callback.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_callback.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_callback.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_event_handler_non_null.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_event_handler_non_null.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_for_each_iterator_callback.cc", @@ -135,10 +137,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_custom_layout_constraints_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_timeline_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_timeline_options.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_prepare_options.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_prepare_options.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_start_options.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_start_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_set_element_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_set_element_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_dom_matrix_2d_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_dom_matrix_2d_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_dom_matrix_init.cc", @@ -484,8 +484,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_resize_quality.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_response_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_response_type.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_root_transition_type.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_root_transition_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_behavior.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_behavior.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_direction.cc", @@ -737,8 +735,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_timeline.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_config.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_transition_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_document_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_dom_exception.cc",
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index 8ed9469..ea7778e 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -1208,8 +1208,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_midi_port_device_state.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_midi_port_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_midi_port_type.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_mode.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_notification_action_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_notification_action_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_notification_direction.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index c40506e0..43598ff 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -126,9 +126,8 @@ "//third_party/blink/renderer/core/css/style_sheet.idl", "//third_party/blink/renderer/core/css/style_sheet_list.idl", "//third_party/blink/renderer/core/document_transition/document_transition.idl", - "//third_party/blink/renderer/core/document_transition/document_transition_config.idl", - "//third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl", - "//third_party/blink/renderer/core/document_transition/document_transition_start_options.idl", + "//third_party/blink/renderer/core/document_transition/document_transition_callback.idl", + "//third_party/blink/renderer/core/document_transition/document_transition_set_element_options.idl", "//third_party/blink/renderer/core/document_transition/document_transition_supplement.idl", "//third_party/blink/renderer/core/dom/abort_controller.idl", "//third_party/blink/renderer/core/dom/abort_signal.idl",
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc index 27bf208b..de5b01c 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -1575,10 +1575,6 @@ return pseudos_in_has_argument_.Contains(pseudo_type); } -bool RuleFeatureSet::NeedsHasInvalidationForPseudoStateChange() const { - return !pseudos_in_has_argument_.IsEmpty(); -} - void RuleFeatureSet::InvalidationSetFeatures::Add( const InvalidationSetFeatures& other) { classes.AppendVector(other.classes);
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.h b/third_party/blink/renderer/core/css/rule_feature_set.h index 77e62474..038fa03e9 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.h +++ b/third_party/blink/renderer/core/css/rule_feature_set.h
@@ -155,7 +155,27 @@ bool NeedsHasInvalidationForElement(Element&) const; bool NeedsHasInvalidationForPseudoClass( CSSSelector::PseudoType pseudo_type) const; - bool NeedsHasInvalidationForPseudoStateChange() const; + + inline bool NeedsHasInvalidationForClassChange() const { + return !classes_in_has_argument_.IsEmpty(); + } + inline bool NeedsHasInvalidationForAttributeChange() const { + return !attributes_in_has_argument_.IsEmpty(); + } + inline bool NeedsHasInvalidationForIdChange() const { + return !ids_in_has_argument_.IsEmpty(); + } + inline bool NeedsHasInvalidationForPseudoStateChange() const { + return !pseudos_in_has_argument_.IsEmpty(); + } + inline bool NeedsHasInvalidation() const { + return universal_in_has_argument_ || + !tag_names_in_has_argument_.IsEmpty() || + NeedsHasInvalidationForClassChange() || + NeedsHasInvalidationForAttributeChange() || + NeedsHasInvalidationForIdChange() || + NeedsHasInvalidationForPseudoStateChange(); + } bool HasIdsInSelectors() const { return id_invalidation_sets_.size() > 0; } bool InvalidatesParts() const { return metadata_.invalidates_parts; }
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index b0e652e8..34f0e175 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -1071,6 +1071,7 @@ const RuleFeatureSet& features = GetRuleFeatureSet(); if (RuntimeEnabledFeatures::CSSPseudoHasEnabled() && + features.NeedsHasInvalidationForClassChange() && PossiblyAffectingHasState(element)) { unsigned changed_size = changed_classes.size(); for (unsigned i = 0; i < changed_size; ++i) { @@ -1105,9 +1106,12 @@ return; } + const RuleFeatureSet& features = GetRuleFeatureSet(); + bool needs_schedule_invalidation = !IsSubtreeAndSiblingsStyleDirty(element); bool possibly_affecting_has_state = RuntimeEnabledFeatures::CSSPseudoHasEnabled() && + features.NeedsHasInvalidationForClassChange() && PossiblyAffectingHasState(element); if (!needs_schedule_invalidation && !possibly_affecting_has_state) return; @@ -1118,7 +1122,6 @@ InvalidationLists invalidation_lists; bool affecting_has_state = false; - const RuleFeatureSet& features = GetRuleFeatureSet(); for (unsigned i = 0; i < new_classes.size(); ++i) { bool found = false; @@ -1197,6 +1200,7 @@ const RuleFeatureSet& features = GetRuleFeatureSet(); if (RuntimeEnabledFeatures::CSSPseudoHasEnabled() && + features.NeedsHasInvalidationForAttributeChange() && PossiblyAffectingHasState(element)) { if (features.NeedsHasInvalidationForAttribute(attribute_name)) InvalidateAncestorsOrSiblingsAffectedByHas(element); @@ -1228,6 +1232,7 @@ const RuleFeatureSet& features = GetRuleFeatureSet(); if (RuntimeEnabledFeatures::CSSPseudoHasEnabled() && + features.NeedsHasInvalidationForIdChange() && PossiblyAffectingHasState(element)) { if ((!old_id.IsEmpty() && features.NeedsHasInvalidationForId(old_id)) || (!new_id.IsEmpty() && features.NeedsHasInvalidationForId(new_id))) { @@ -1262,6 +1267,7 @@ if (invalidate_ancestors_or_siblings && RuntimeEnabledFeatures::CSSPseudoHasEnabled() && + features.NeedsHasInvalidationForPseudoStateChange() && PossiblyAffectingHasState(element)) { if (features.NeedsHasInvalidationForPseudoClass(pseudo_type)) InvalidateAncestorsOrSiblingsAffectedByHasForPseudoChange(element); @@ -1485,6 +1491,8 @@ return; const RuleFeatureSet& features = GetRuleFeatureSet(); + if (!features.NeedsHasInvalidation()) + return; if (features.NeedsHasInvalidationForElement(element)) { InvalidateAncestorsOrSiblingsAffectedByHas( @@ -1505,6 +1513,9 @@ return; const RuleFeatureSet& features = GetRuleFeatureSet(); + if (!features.NeedsHasInvalidation()) + return; + for (Element& element : ElementTraversal::InclusiveDescendantsOf(subtree_root)) { if (features.NeedsHasInvalidationForElement(element)) {
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.cc b/third_party/blink/renderer/core/document_transition/document_transition.cc index 7c69ea8..81dfae6 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition.cc
@@ -10,17 +10,13 @@ #include "cc/document_transition/document_transition_request.h" #include "cc/trees/paint_holding_reason.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_config.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_prepare_options.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_start_options.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_set_element_options.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" -#include "third_party/blink/renderer/core/dom/abort_signal.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/layout/layout_box_model_object.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/chrome_client.h" @@ -36,58 +32,15 @@ namespace blink { namespace { -const char kAbortedFromPrepare[] = "Aborted due to prepare() call"; -const char kAbortedFromSignal[] = "Aborted due to abortSignal"; - -DocumentTransitionRequest::Effect ParseEffect(const String& input) { - using MapType = HashMap<String, DocumentTransitionRequest::Effect>; - DEFINE_STATIC_LOCAL( - MapType*, lookup_map, - (new MapType{ - {"cover-down", DocumentTransitionRequest::Effect::kCoverDown}, - {"cover-left", DocumentTransitionRequest::Effect::kCoverLeft}, - {"cover-right", DocumentTransitionRequest::Effect::kCoverRight}, - {"cover-up", DocumentTransitionRequest::Effect::kCoverUp}, - {"explode", DocumentTransitionRequest::Effect::kExplode}, - {"fade", DocumentTransitionRequest::Effect::kFade}, - {"implode", DocumentTransitionRequest::Effect::kImplode}, - {"reveal-down", DocumentTransitionRequest::Effect::kRevealDown}, - {"reveal-left", DocumentTransitionRequest::Effect::kRevealLeft}, - {"reveal-right", DocumentTransitionRequest::Effect::kRevealRight}, - {"reveal-up", DocumentTransitionRequest::Effect::kRevealUp}})); - - auto it = lookup_map->find(input); - return it != lookup_map->end() ? it->value - : DocumentTransitionRequest::Effect::kNone; -} - -DocumentTransitionRequest::Effect ParseRootTransition( - const DocumentTransitionPrepareOptions* options) { - return options->hasRootTransition() - ? ParseEffect(options->rootTransition()) - : DocumentTransitionRequest::Effect::kNone; -} +const char kAbortedFromCaptureAndHold[] = + "Aborted due to captureAndHold() call"; +const char kAbortedFromScript[] = "Aborted due to abort() call"; uint32_t NextDocumentTag() { static uint32_t next_document_tag = 1u; return next_document_tag++; } -DocumentTransitionRequest::TransitionConfig ParseTransitionConfig( - const DocumentTransitionConfig& config) { - DocumentTransitionRequest::TransitionConfig transition_config; - - if (config.hasDuration()) { - transition_config.duration = base::Milliseconds(config.duration()); - } - - if (config.hasDelay()) { - transition_config.delay = base::Milliseconds(config.delay()); - } - - return transition_config; -} - } // namespace DocumentTransition::DocumentTransition(Document* document) @@ -97,10 +50,8 @@ void DocumentTransition::Trace(Visitor* visitor) const { visitor->Trace(document_); - visitor->Trace(prepare_promise_resolver_); + visitor->Trace(capture_promise_resolver_); visitor->Trace(start_promise_resolver_); - visitor->Trace(active_shared_elements_); - visitor->Trace(signal_); visitor->Trace(style_tracker_); ScriptWrappable::Trace(visitor); @@ -109,9 +60,9 @@ } void DocumentTransition::ContextDestroyed() { - if (prepare_promise_resolver_) { - prepare_promise_resolver_->Detach(); - prepare_promise_resolver_ = nullptr; + if (capture_promise_resolver_) { + capture_promise_resolver_->Detach(); + capture_promise_resolver_ = nullptr; } if (start_promise_resolver_) { start_promise_resolver_->Detach(); @@ -121,18 +72,44 @@ } bool DocumentTransition::HasPendingActivity() const { - if (prepare_promise_resolver_ || start_promise_resolver_) + if (capture_promise_resolver_ || start_promise_resolver_) return true; return false; } -ScriptPromise DocumentTransition::prepare( +void DocumentTransition::AssertNoTransition() { + DCHECK_EQ(state_, State::kIdle); + DCHECK(!style_tracker_); + DCHECK(!capture_promise_resolver_); + DCHECK(!start_promise_resolver_); +} + +void DocumentTransition::StartNewTransition() { + style_tracker_ = + MakeGarbageCollected<DocumentTransitionStyleTracker>(*document_); +} + +void DocumentTransition::FinalizeNewTransition() {} + +void DocumentTransition::setElement( ScriptState* script_state, - const DocumentTransitionPrepareOptions* options, + Element* element, + const AtomicString& tag, + const DocumentTransitionSetElementOptions* opts, + ExceptionState& exception_state) { + DCHECK(style_tracker_); + if (tag.IsNull()) + style_tracker_->RemoveSharedElement(element); + else + style_tracker_->AddSharedElement(element, tag); +} + +ScriptPromise DocumentTransition::captureAndHold( + ScriptState* script_state, ExceptionState& exception_state) { // Reject any previous prepare promises. - if (state_ == State::kPreparing || state_ == State::kPrepared) - CancelPendingTransition(kAbortedFromPrepare); + if (state_ == State::kCapturing || state_ == State::kCaptured) + CancelPendingTransition(kAbortedFromCaptureAndHold); // Get the sequence id before any early outs so we will correctly process // callbacks from previous requests. @@ -155,148 +132,52 @@ return ScriptPromise(); } - std::string error; - DocumentTransitionRequest::TransitionConfig root_config; - if (options->hasRootConfig()) - root_config = ParseTransitionConfig(*options->rootConfig()); - if (!root_config.IsValid(&error)) { - exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, - String(error.data(), error.size())); - return ScriptPromise(); - } - - // This stores a per-shared-element configuration, if specified. Note that - // this is likely to change when the API is redesigned at - // https://github.com/WICG/shared-element-transitions. - // - // Note that we add one extra config for the "root" element, after parsing the - // shared elements. - std::vector<DocumentTransitionRequest::TransitionConfig> - shared_elements_config; - if (options->hasSharedElements()) { - shared_elements_config.resize(options->sharedElements().size()); - - // TODO(vmpstr): This is likely to be superceded by CSS customization. - if (options->hasSharedElementsConfig()) { - const auto& shared_elements_config_options = - options->sharedElementsConfig(); - - if (shared_elements_config_options.size() != - shared_elements_config.size()) { - exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, - "The sharedElementsConfig size must " - "match the list of shared elements"); - return ScriptPromise(); - } - - for (wtf_size_t i = 0; i < shared_elements_config_options.size(); i++) { - shared_elements_config[i] = - ParseTransitionConfig(*shared_elements_config_options[i]); - if (!shared_elements_config[i].IsValid(&error)) { - exception_state.ThrowDOMException( - DOMExceptionCode::kInvalidStateError, - String(error.data(), error.size())); - return ScriptPromise(); - } - } - } - } - - // The root snapshot is handled as a shared element by the compositing stack. - shared_elements_config.emplace_back(); - - if (options->hasAbortSignal()) { - if (options->abortSignal()->aborted()) { - exception_state.ThrowDOMException(DOMExceptionCode::kAbortError, - kAbortedFromSignal); - return ScriptPromise(); - } - - signal_ = options->abortSignal(); - signal_->AddAlgorithm(WTF::Bind(&DocumentTransition::Abort, - WrapWeakPersistent(this), - WrapWeakPersistent(signal_.Get()))); - } - - // We're going to be creating a new transition, parse the options. - auto effect = ParseRootTransition(options); - if (options->hasSharedElements()) - SetActiveSharedElements(options->sharedElements()); - prepare_shared_element_count_ = active_shared_elements_.size(); - - prepare_promise_resolver_ = + capture_promise_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - state_ = State::kPreparing; - pending_request_ = DocumentTransitionRequest::CreatePrepare( - effect, document_tag_, root_config, std::move(shared_elements_config), + state_ = State::kCapturing; + pending_request_ = DocumentTransitionRequest::CreateCapture( + document_tag_, style_tracker_->PendingSharedElementCount() + 1, ConvertToBaseOnceCallback(CrossThreadBindOnce( - &DocumentTransition::NotifyPrepareFinished, - WrapCrossThreadWeakPersistent(this), last_prepare_sequence_id_)), - /*is_renderer_transition=*/true); + &DocumentTransition::NotifyCaptureFinished, + WrapCrossThreadWeakPersistent(this), last_prepare_sequence_id_))); - style_tracker_ = - MakeGarbageCollected<DocumentTransitionStyleTracker>(*document_); - style_tracker_->Prepare(active_shared_elements_); - + style_tracker_->Capture(); NotifyHasChangesToCommit(); - return prepare_promise_resolver_->Promise(); + + return capture_promise_resolver_->Promise(); } -void DocumentTransition::Abort(AbortSignal* signal) { - // There is no RemoveAlgorithm() method on AbortSignal so compare the signal - // bound to this callback to the one last passed to start(). - if (signal_ != signal) - return; - - CancelPendingTransition(kAbortedFromSignal); -} - -ScriptPromise DocumentTransition::start( - ScriptState* script_state, - const DocumentTransitionStartOptions* options, - ExceptionState& exception_state) { - if (state_ != State::kPrepared) { +ScriptPromise DocumentTransition::start(ScriptState* script_state, + ExceptionState& exception_state) { + if (state_ != State::kCaptured) { exception_state.ThrowDOMException( DOMExceptionCode::kInvalidStateError, "Transition must be prepared before it can be started."); return ScriptPromise(); } - signal_ = nullptr; StopDeferringCommits(); - if (options->hasSharedElements()) - SetActiveSharedElements(options->sharedElements()); - - // We need to have the same amount of shared elements (even if null) as the - // prepared ones. - if (prepare_shared_element_count_ != active_shared_elements_.size()) { - exception_state.ThrowDOMException( - DOMExceptionCode::kInvalidStateError, - String::Format("Start request sharedElement count (%u) must match the " - "prepare sharedElement count (%u).", - active_shared_elements_.size(), - prepare_shared_element_count_)); - - // TODO(khushalsagar) : Viz keeps copy results cached for 5 seconds at this - // point. We should send an early release. See crbug.com/1266500. - ResetState(); - return ScriptPromise(); - } - last_start_sequence_id_ = next_sequence_id_++; state_ = State::kStarted; start_promise_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); pending_request_ = DocumentTransitionRequest::CreateAnimateRenderer(document_tag_); - style_tracker_->Start(active_shared_elements_); + style_tracker_->Start(); NotifyHasChangesToCommit(); return start_promise_resolver_->Promise(); } +void DocumentTransition::ignoreCSSTaggedElements(ScriptState*, + ExceptionState&) {} + +void DocumentTransition::abandon(ScriptState*, ExceptionState&) { + CancelPendingTransition(kAbortedFromScript); +} + void DocumentTransition::NotifyHasChangesToCommit() { if (!document_ || !document_->GetPage() || !document_->View()) return; @@ -309,27 +190,26 @@ document_->View()->SetPaintArtifactCompositorNeedsUpdate(); } -void DocumentTransition::NotifyPrepareFinished(uint32_t sequence_id) { +void DocumentTransition::NotifyCaptureFinished(uint32_t sequence_id) { // This notification is for a different sequence id. if (sequence_id != last_prepare_sequence_id_) return; // We could have detached the resolver if the execution context was destroyed. - if (!prepare_promise_resolver_) + if (!capture_promise_resolver_) return; - DCHECK(state_ == State::kPreparing); - DCHECK(prepare_promise_resolver_); + DCHECK(state_ == State::kCapturing); + DCHECK(capture_promise_resolver_); if (style_tracker_) - style_tracker_->PrepareResolved(); + style_tracker_->CaptureResolved(); // Defer commits before resolving the promise to ensure any updates made in // the callback are deferred. StartDeferringCommits(); - prepare_promise_resolver_->Resolve(); - prepare_promise_resolver_ = nullptr; - state_ = State::kPrepared; - SetActiveSharedElements({}); + capture_promise_resolver_->Resolve(); + capture_promise_resolver_ = nullptr; + state_ = State::kCaptured; } void DocumentTransition::NotifyStartFinished(uint32_t sequence_id) { @@ -364,8 +244,10 @@ bool DocumentTransition::IsTransitionParticipant( const LayoutObject& object) const { - // If our state is idle it implies that we have no style tracker. - DCHECK(state_ != State::kIdle || !style_tracker_); + // If our state is idle and we're outside of script mutation scope, it implies + // that we have no style tracker. + DCHECK(state_ != State::kIdle || script_mutations_allowed_ || + !style_tracker_); // The layout view is always a participant if there is a transition. if (auto* layout_view = DynamicTo<LayoutView>(object)) @@ -373,7 +255,7 @@ // Otherwise check if the layout object has an active shared element. auto* element = DynamicTo<Element>(object.GetNode()); - return element && active_shared_elements_.Contains(element); + return element && style_tracker_ && style_tracker_->IsSharedElement(element); } PaintPropertyChangeType DocumentTransition::UpdateEffect( @@ -396,29 +278,17 @@ if (!element) { // The only non-element participant is the layout view. DCHECK(object.IsLayoutView()); - // This matches one past the size of the shared element configs generated in - // ::prepare(). - state.document_transition_shared_element_id.AddIndex( - active_shared_elements_.size()); - state.shared_element_resource_id = style_tracker_->GetLiveRootSnapshotId(); + + style_tracker_->UpdateRootIndexAndSnapshotId( + state.document_transition_shared_element_id, + state.shared_element_resource_id); DCHECK(state.document_transition_shared_element_id.valid()); return style_tracker_->UpdateRootEffect(std::move(state), current_effect); } - for (wtf_size_t i = 0; i < active_shared_elements_.size(); ++i) { - if (active_shared_elements_[i] != element) - continue; - state.document_transition_shared_element_id.AddIndex(i); - - // This tags the shared element's content with the resource id used by the - // first pseudo element. This is okay since in the eventual API we should - // have a 1:1 mapping between shared elements and pseudo elements. - if (!state.shared_element_resource_id.IsValid()) { - state.shared_element_resource_id = - style_tracker_->GetLiveSnapshotId(element); - } - } - + style_tracker_->UpdateElementIndicesAndSnapshotId( + element, state.document_transition_shared_element_id, + state.shared_element_resource_id); return style_tracker_->UpdateEffect(element, std::move(state), current_effect); } @@ -434,39 +304,8 @@ } void DocumentTransition::VerifySharedElements() { - for (auto& active_element : active_shared_elements_) { - if (!active_element) - continue; - - auto* object = active_element->GetLayoutObject(); - - // TODO(vmpstr): Should this work for replaced elements as well? - if (object) { - if (object->ShouldApplyPaintContainment()) - continue; - - auto* console_message = MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kRendering, - mojom::ConsoleMessageLevel::kError, - "Dropping element from transition. Shared element must have " - "containt:paint"); - console_message->SetNodes(document_->GetFrame(), - {DOMNodeIds::IdForNode(active_element)}); - document_->AddConsoleMessage(console_message); - } - - // Clear the shared element. Note that we don't remove the element from the - // vector, since we need to preserve the order of the elements and we - // support nulls as a valid active element. - - // Invalidate the element since we should no longer be compositing it. - auto* box = active_element->GetLayoutBox(); - if (box && box->HasSelfPaintingLayer()) { - box->SetNeedsPaintPropertyUpdate(); - box->Layer()->SetNeedsCompositingInputsUpdate(); - } - active_element = nullptr; - } + if (state_ != State::kIdle) + style_tracker_->VerifySharedElements(); } void DocumentTransition::RunPostLayoutSteps() { @@ -521,41 +360,9 @@ const String& DocumentTransition::UAStyleSheet() const { DCHECK(style_tracker_); - return style_tracker_->UAStyleSheet(); } -void DocumentTransition::SetActiveSharedElements( - HeapVector<Member<Element>> elements) { - // The way this is used, we should never be overriding a non-empty set with - // another non-empty set of elements. - DCHECK(elements.IsEmpty() || active_shared_elements_.IsEmpty()); - - InvalidateActiveElements(); - active_shared_elements_ = std::move(elements); - InvalidateActiveElements(); -} - -void DocumentTransition::InvalidateActiveElements() { - for (auto& element : active_shared_elements_) { - // We allow nulls. - if (!element) - continue; - - auto* box = element->GetLayoutBox(); - if (!box || !box->HasSelfPaintingLayer()) - continue; - - // We propagate the shared element id on an effect node for the object. This - // means that we should update the paint properties to update the shared - // element id. - box->SetNeedsPaintPropertyUpdate(); - - // We might need to composite or decomposite this layer. - box->Layer()->SetNeedsCompositingInputsUpdate(); - } -} - void DocumentTransition::StartDeferringCommits() { DCHECK(!deferring_commits_); @@ -593,26 +400,29 @@ } void DocumentTransition::CancelPendingTransition(const char* abort_message) { - DCHECK(state_ == State::kPreparing || state_ == State::kPrepared) - << "Can not cancel transition at state : " << static_cast<int>(state_); - - if (prepare_promise_resolver_) { - prepare_promise_resolver_->Reject(MakeGarbageCollected<DOMException>( + if (capture_promise_resolver_) { + capture_promise_resolver_->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kAbortError, abort_message)); - prepare_promise_resolver_ = nullptr; + capture_promise_resolver_ = nullptr; + } + if (start_promise_resolver_) { + start_promise_resolver_->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kAbortError, abort_message)); + start_promise_resolver_ = nullptr; } ResetState(); } void DocumentTransition::ResetState(bool abort_style_tracker) { - SetActiveSharedElements({}); if (style_tracker_ && abort_style_tracker) style_tracker_->Abort(); style_tracker_ = nullptr; StopDeferringCommits(); state_ = State::kIdle; - signal_ = nullptr; + // If script mutations are still allowed, we recreate the style tracker. + if (script_mutations_allowed_) + StartNewTransition(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.h b/third_party/blink/renderer/core/document_transition/document_transition.h index 17bbbd54..edcca73e 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition.h +++ b/third_party/blink/renderer/core/document_transition/document_transition.h
@@ -22,10 +22,8 @@ namespace blink { -class AbortSignal; class Document; -class DocumentTransitionPrepareOptions; -class DocumentTransitionStartOptions; +class DocumentTransitionSetElementOptions; class Element; class ExceptionState; class LayoutObject; @@ -53,13 +51,46 @@ // ActiveScriptWrappable functionality. bool HasPendingActivity() const override; + bool CanCreateNewTransition() const { + return state_ == State::kIdle && !script_mutations_allowed_; + } + + class ScriptMutationsAllowedScope { + STACK_ALLOCATED(); + + public: + ~ScriptMutationsAllowedScope() { + transition_->script_mutations_allowed_ = false; + transition_->FinalizeNewTransition(); + } + + private: + friend class DocumentTransition; + + explicit ScriptMutationsAllowedScope(DocumentTransition* transition) + : transition_(transition) { + transition_->script_mutations_allowed_ = true; + transition_->AssertNoTransition(); + transition_->StartNewTransition(); + } + + DocumentTransition* transition_; + }; + + ScriptMutationsAllowedScope CreateScriptMutationsAllowedScope() { + return ScriptMutationsAllowedScope{this}; + } + // JavaScript API implementation. - ScriptPromise prepare(ScriptState*, - const DocumentTransitionPrepareOptions*, - ExceptionState&); - ScriptPromise start(ScriptState*, - const DocumentTransitionStartOptions*, - ExceptionState&); + void setElement(ScriptState*, + Element*, + const AtomicString&, + const DocumentTransitionSetElementOptions*, + ExceptionState&); + ScriptPromise captureAndHold(ScriptState*, ExceptionState&); + ScriptPromise start(ScriptState*, ExceptionState&); + void ignoreCSSTaggedElements(ScriptState*, ExceptionState&); + void abandon(ScriptState*, ExceptionState&); // This uses std::move semantics to take the request from this object. std::unique_ptr<DocumentTransitionRequest> TakePendingRequest(); @@ -105,21 +136,22 @@ // LifecycleNotificationObserver overrides. void WillStartLifecycleUpdate(const LocalFrameView&) override; + bool HasActiveTransition() const { return state_ != State::kIdle; } + private: friend class DocumentTransitionTest; - enum class State { kIdle, kPreparing, kPrepared, kStarted }; + enum class State { kIdle, kCapturing, kCaptured, kStarted }; + + void AssertNoTransition(); + void StartNewTransition(); + void FinalizeNewTransition(); void NotifyHasChangesToCommit(); - void NotifyPrepareFinished(uint32_t sequence_id); + void NotifyCaptureFinished(uint32_t sequence_id); void NotifyStartFinished(uint32_t sequence_id); - // Sets new active shared elements. Note that this is responsible for making - // sure we invalidate the right bits both on the old and new elements. - void SetActiveSharedElements(HeapVector<Member<Element>> elements); - void InvalidateActiveElements(); - // Used to defer visual updates between transition prepare finishing and // transition start to allow the page to set up the final scene // asynchronously. @@ -129,8 +161,6 @@ // Allow canceling a transition until it reaches start(). void CancelPendingTransition(const char* abort_message); - void Abort(AbortSignal* signal); - // Resets internal state, called in both abort situations and transition // finished situations. void ResetState(bool abort_style_tracker = true); @@ -139,20 +169,8 @@ State state_ = State::kIdle; - Member<ScriptPromiseResolver> prepare_promise_resolver_; + Member<ScriptPromiseResolver> capture_promise_resolver_; Member<ScriptPromiseResolver> start_promise_resolver_; - Member<AbortSignal> signal_; - - // `active_shared_elements_` represents elements that are identified as shared - // during the current step of the transition. Specifically, it represents - // `prepare()` call sharedElements if the state is kPreparing and `start()` - // call sharedElements if the state is kStarted. - // `prepare_shared_element_count_` represents the number of shared elements - // that were specified in the `prepare()` call. This is used to verify that - // the number of shared elements specified in the `prepare()` and `start()` - // calls is the same. - HeapVector<Member<Element>> active_shared_elements_; - wtf_size_t prepare_shared_element_count_ = 0u; // Created conditionally if renderer based SharedElementTransitions is // enabled. @@ -174,6 +192,9 @@ bool deferring_commits_ = false; + // This is set to true when we allow script calls to modify state. + bool script_mutations_allowed_ = false; + // Set only for tests. bool disable_end_transition_ = false; };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.idl b/third_party/blink/renderer/core/document_transition/document_transition.idl index e1b8042..7c304109 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition.idl +++ b/third_party/blink/renderer/core/document_transition/document_transition.idl
@@ -9,13 +9,21 @@ Exposed=Window, RuntimeEnabled=DocumentTransition ] interface DocumentTransition { - // - This should only be called after any previous start() calls have resolved. - // - Rejects any previous unresolved prepare() promises. - // - Returns a promise that resolves after the transition has been - // prepared. - [CallWith=ScriptState, RaisesException] Promise<void> prepare(optional DocumentTransitionPrepareOptions options = {}); + // Set or unset (if tag is null) an element that will participate in the next + // transition, whether as a part of captureAndHold or start phases. + [CallWith=ScriptState, RaisesException] void setElement(Element element, DOMString? tag, optional DocumentTransitionSetElementOptions options = {}); - // Can only be called after prepare(), during the task during - // which prepare() most recently resolved. - [CallWith=ScriptState, RaisesException] Promise<void> start(optional DocumentTransitionStartOptions options = {}); + // Request to capture the currently set elements, including the root, and + // hold visual contents until start is called + [CallWith=ScriptState, RaisesException] Promise<void> captureAndHold(); + + // Starts the transition with the captured elements and elements set for + // start. + [CallWith=ScriptState, RaisesException] Promise<void> start(); + + // Ignores CSS tagged elements + [CallWith=ScriptState, RaisesException] void ignoreCSSTaggedElements(); + + // Abandons the transition. + [CallWith=ScriptState, RaisesException] void abandon(); };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_callback.idl b/third_party/blink/renderer/core/document_transition/document_transition_callback.idl new file mode 100644 index 0000000..bf1e354 --- /dev/null +++ b/third_party/blink/renderer/core/document_transition/document_transition_callback.idl
@@ -0,0 +1,8 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[ + RuntimeEnabled=DocumentTransition +] callback DocumentTransitionCallback = void(DocumentTransition documentTransition); +
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_config.idl b/third_party/blink/renderer/core/document_transition/document_transition_config.idl deleted file mode 100644 index 3e404d2..0000000 --- a/third_party/blink/renderer/core/document_transition/document_transition_config.idl +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -dictionary DocumentTransitionConfig { - DOMTimeStamp duration; - DOMTimeStamp delay; -};
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl b/third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl deleted file mode 100644 index c373f3bd..0000000 --- a/third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -enum RootTransitionType { - "none", - "cover-down", - "cover-left", - "cover-right", - "cover-up", - "explode", - "fade", - "implode", - "reveal-down", - "reveal-left", - "reveal-right", - "reveal-up" -}; - -dictionary DocumentTransitionPrepareOptions { - RootTransitionType rootTransition; - DocumentTransitionConfig rootConfig; - sequence<Element?> sharedElements; - AbortSignal abortSignal; - - // This config should be folded with the list of |sharedElements| into a - // single dictionary. Fix once we have a resolution on API shape : - // https://github.com/WICG/shared-element-transitions/issues/2. - sequence<DocumentTransitionConfig> sharedElementsConfig; -};
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_start_options.idl b/third_party/blink/renderer/core/document_transition/document_transition_set_element_options.idl similarity index 67% rename from third_party/blink/renderer/core/document_transition/document_transition_start_options.idl rename to third_party/blink/renderer/core/document_transition/document_transition_set_element_options.idl index 8bc91eb..8c7837a 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_start_options.idl +++ b/third_party/blink/renderer/core/document_transition/document_transition_set_element_options.idl
@@ -2,6 +2,5 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -dictionary DocumentTransitionStartOptions { - sequence<Element?> sharedElements; +dictionary DocumentTransitionSetElementOptions { };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc index 28e99cb..a42a792 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/core/document_transition/document_transition_utils.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/resize_observer/resize_observer_entry.h" @@ -26,11 +27,19 @@ namespace blink { namespace { +const char* kElementSetModificationError = + "The element set cannot be modified at this transition state."; + +const char* kPaintContainmentNotSatisfied = + "Dropping element from transition. Shared element must contain paint"; + const AtomicString& RootTag() { DEFINE_STATIC_LOCAL(AtomicString, kRootTag, ("root")); return kRootTag; } +constexpr int root_index = 0; + const String& StaticUAStyles() { DEFINE_STATIC_LOCAL( String, kStaticUAStyles, @@ -45,12 +54,6 @@ return kAnimationUAStyles; } -AtomicString IdFromIndex(wtf_size_t index) { - StringBuilder builder; - builder.AppendFormat("shared-%d", index); - return builder.ToAtomicString(); -} - } // namespace class DocumentTransitionStyleTracker::ImageWrapperPseudoElement @@ -104,71 +107,122 @@ DocumentTransitionStyleTracker::~DocumentTransitionStyleTracker() = default; -void DocumentTransitionStyleTracker::Prepare( - const HeapVector<Member<Element>>& old_elements) { +void DocumentTransitionStyleTracker::AddConsoleError( + AtomicString message, + Vector<DOMNodeId> related_nodes) { + auto* console_message = MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kRendering, + mojom::blink::ConsoleMessageLevel::kError, std::move(message)); + console_message->SetNodes(document_->GetFrame(), std::move(related_nodes)); + document_->AddConsoleMessage(console_message); +} + +void DocumentTransitionStyleTracker::AddSharedElement(Element* element, + const AtomicString& tag) { + DCHECK(element); + if (state_ == State::kCapturing || state_ == State::kStarted) { + AddConsoleError(kElementSetModificationError, + {DOMNodeIds::IdForNode(element)}); + return; + } + + // TODO(vmpstr): One element can have multiple tags associated with it, but + // it isn't currently allowed to have one tag be associated with more than one + // element. The explainer dictates to abandon the transition. We need to + // detect that case and abandon the transition. + pending_shared_elements_.push_back(element); + pseudo_document_transition_tags_.push_back(tag); +} + +void DocumentTransitionStyleTracker::RemoveSharedElement(Element* element) { + // TODO(vmpstr): Log a console warning if we're modifying elements in a state + // that does not permit to do so. + if (state_ == State::kCapturing || state_ == State::kStarted) { + AddConsoleError(kElementSetModificationError, + {DOMNodeIds::IdForNode(element)}); + return; + } + for (wtf_size_t i = 0; i < pending_shared_elements_.size(); ++i) { + if (pending_shared_elements_[i] == element) { + pending_shared_elements_.EraseAt(i); + pseudo_document_transition_tags_.EraseAt(i); + } + } +} + +void DocumentTransitionStyleTracker::Capture() { DCHECK_EQ(state_, State::kIdle); - state_ = State::kPreparing; - - // An id for each shared element + root. - pseudo_document_transition_tags_.resize(old_elements.size() + 1); + state_ = State::kCapturing; // The order of IDs in this list defines the DOM order and as a result the // paint order of these elements. This is why root needs to be first in the // list. - pseudo_document_transition_tags_[0] = RootTag(); old_root_snapshot_id_ = viz::SharedElementResourceId::Generate(); - element_data_map_.ReserveCapacityForSize(old_elements.size()); - for (wtf_size_t i = 0; i < old_elements.size(); ++i) { - auto document_transition_tag = IdFromIndex(i); + element_data_map_.ReserveCapacityForSize(pending_shared_elements_.size()); + for (wtf_size_t i = 0; i < pending_shared_elements_.size(); ++i) { + const auto& document_transition_tag = pseudo_document_transition_tags_[i]; auto* element_data = MakeGarbageCollected<ElementData>(); - element_data->target_element = old_elements[i]; - if (old_elements[i]) + element_data->target_element = pending_shared_elements_[i]; + DCHECK_NE(root_index, static_cast<int>(i + 1)); + element_data->element_index = i + 1; + if (pending_shared_elements_[i]) element_data->old_snapshot_id = viz::SharedElementResourceId::Generate(); element_data_map_.insert(document_transition_tag, std::move(element_data)); - - pseudo_document_transition_tags_[i + 1] = - std::move(document_transition_tag); } + // TODO(vmpstr): This is a bit awkward. push/set/pop + pseudo_document_transition_tags_.push_front(RootTag()); document_->GetStyleEngine().SetDocumentTransitionTags( pseudo_document_transition_tags_); + pseudo_document_transition_tags_.EraseAt(0); // We need a style invalidation to generate the pseudo element tree. InvalidateStyle(); } -void DocumentTransitionStyleTracker::PrepareResolved() { - DCHECK_EQ(state_, State::kPreparing); +void DocumentTransitionStyleTracker::CaptureResolved() { + DCHECK_EQ(state_, State::kCapturing); - state_ = State::kPrepared; + state_ = State::kCaptured; + + // Since the elements will be unset, we need to invalidate their style first. + // TODO(vmpstr): We don't have to invalidate the pseudo styles at this point, + // just the shared elements. We can split InvalidateStyle() into two functions + // as an optimization. + InvalidateStyle(); for (auto& entry : element_data_map_) { auto& element_data = entry.value; element_data->target_element = nullptr; element_data->cached_border_box_size = element_data->border_box_size; element_data->cached_viewport_matrix = element_data->viewport_matrix; - } -} - -void DocumentTransitionStyleTracker::Start( - const HeapVector<Member<Element>>& new_elements) { - DCHECK_EQ(state_, State::kPrepared); - DCHECK_EQ(element_data_map_.size(), new_elements.size()); - - state_ = State::kStarted; - new_root_snapshot_id_ = viz::SharedElementResourceId::Generate(); - for (wtf_size_t i = 0; i < new_elements.size(); ++i) { - auto document_transition_tag = IdFromIndex(i); - - auto& element_data = element_data_map_.find(document_transition_tag)->value; - element_data->target_element = new_elements[i]; - if (new_elements[i]) - element_data->new_snapshot_id = viz::SharedElementResourceId::Generate(); element_data->effect_node = nullptr; } root_effect_node_ = nullptr; +} + +void DocumentTransitionStyleTracker::Start() { + DCHECK_EQ(state_, State::kCaptured); + + state_ = State::kStarted; + new_root_snapshot_id_ = viz::SharedElementResourceId::Generate(); + for (wtf_size_t i = 0; i < pending_shared_elements_.size(); ++i) { + const auto& document_transition_tag = pseudo_document_transition_tags_[i]; + + // TODO(vmpstr): Support new elements during start. It requires us to figure + // out what the new document tag set is as well as creating new element + // data. + if (element_data_map_.find(document_transition_tag) == + element_data_map_.end()) + continue; + + auto& element_data = element_data_map_.find(document_transition_tag)->value; + element_data->target_element = pending_shared_elements_[i]; + if (pending_shared_elements_[i]) + element_data->new_snapshot_id = viz::SharedElementResourceId::Generate(); + } // We need a style invalidation to generate new content pseudo elements for // new elements in the DOM. @@ -189,32 +243,39 @@ element_data_map_.clear(); pseudo_document_transition_tags_.clear(); + pending_shared_elements_.clear(); document_->GetStyleEngine().SetDocumentTransitionTags({}); // We need a style invalidation to remove the pseudo element tree. InvalidateStyle(); } -viz::SharedElementResourceId DocumentTransitionStyleTracker::GetLiveSnapshotId( - const Element* element) const { +void DocumentTransitionStyleTracker::UpdateElementIndicesAndSnapshotId( + Element* element, + DocumentTransitionSharedElementId& index, + viz::SharedElementResourceId& resource_id) const { DCHECK(element); for (const auto& entry : element_data_map_) { if (entry.value->target_element == element) { - auto snapshot_id = HasLiveNewContent() ? entry.value->new_snapshot_id - : entry.value->old_snapshot_id; - DCHECK(snapshot_id.IsValid()); - return snapshot_id; + index.AddIndex(entry.value->element_index); + resource_id = HasLiveNewContent() ? entry.value->new_snapshot_id + : entry.value->old_snapshot_id; + DCHECK(resource_id.IsValid()); + return; } } NOTREACHED(); - return viz::SharedElementResourceId(); } -viz::SharedElementResourceId -DocumentTransitionStyleTracker::GetLiveRootSnapshotId() const { - return HasLiveNewContent() ? new_root_snapshot_id_ : old_root_snapshot_id_; +void DocumentTransitionStyleTracker::UpdateRootIndexAndSnapshotId( + DocumentTransitionSharedElementId& index, + viz::SharedElementResourceId& resource_id) const { + index.AddIndex(root_index); + resource_id = + HasLiveNewContent() ? new_root_snapshot_id_ : old_root_snapshot_id_; + DCHECK(resource_id.IsValid()); } PseudoElement* DocumentTransitionStyleTracker::CreatePseudoElement( @@ -426,6 +487,50 @@ return root_effect_node_.get(); } +void DocumentTransitionStyleTracker::VerifySharedElements() { + for (auto& entry : element_data_map_) { + auto& element_data = entry.value; + if (!element_data->target_element) + continue; + auto& active_element = element_data->target_element; + + auto* object = active_element->GetLayoutObject(); + + // TODO(vmpstr): Should this work for replaced elements as well? + if (object) { + if (object->ShouldApplyPaintContainment()) + continue; + + AddConsoleError(kPaintContainmentNotSatisfied, + {DOMNodeIds::IdForNode(active_element)}); + } + + // Clear the shared element. Note that we don't remove the element from the + // vector, since we need to preserve the order of the elements and we + // support nulls as a valid active element. + + // Invalidate the element since we should no longer be compositing it. + auto* box = active_element->GetLayoutBox(); + if (box && box->HasSelfPaintingLayer()) { + box->SetNeedsPaintPropertyUpdate(); + box->Layer()->SetNeedsCompositingInputsUpdate(); + } + active_element = nullptr; + } +} + +bool DocumentTransitionStyleTracker::IsSharedElement(Element* element) const { + // In stable states, we don't have shared elements. + if (state_ == State::kIdle || state_ == State::kCaptured) + return false; + + for (auto& entry : element_data_map_) { + if (entry.value->target_element == element) + return true; + } + return false; +} + void DocumentTransitionStyleTracker::InvalidateStyle() { ua_style_sheet_.reset(); document_->GetStyleEngine().InvalidateUADocumentTransitionStyle(); @@ -449,13 +554,25 @@ if (layout_view->HasSelfPaintingLayer()) layout_view->Layer()->SetNeedsCompositingInputsUpdate(); } + for (auto& entry : element_data_map_) { if (!entry.value->target_element) continue; auto* object = entry.value->target_element->GetLayoutObject(); if (!object) continue; + + // We propagate the shared element id on an effect node for the object. This + // means that we should update the paint properties to update the shared + // element id. object->SetNeedsPaintPropertyUpdate(); + + auto* box = entry.value->target_element->GetLayoutBox(); + if (!box || !box->HasSelfPaintingLayer()) + continue; + + // We might need to composite or decomposite this layer. + box->Layer()->SetNeedsCompositingInputsUpdate(); } } @@ -543,6 +660,7 @@ void DocumentTransitionStyleTracker::Trace(Visitor* visitor) const { visitor->Trace(document_); visitor->Trace(element_data_map_); + visitor->Trace(pending_shared_elements_); } void DocumentTransitionStyleTracker::ElementData::Trace(
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h index 3e0a759..170ae3f12 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h +++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/platform/geometry/layout_size.h" +#include "third_party/blink/renderer/platform/graphics/document_transition_shared_element_id.h" #include "third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" #include "third_party/blink/renderer/platform/transforms/transformation_matrix.h" @@ -36,19 +37,20 @@ explicit DocumentTransitionStyleTracker(Document& document); ~DocumentTransitionStyleTracker(); - // Notifies when the transition is initiated. |elements| is the set of shared - // elements in the old DOM. - void Prepare(const HeapVector<Member<Element>>& old_elements); + void AddSharedElement(Element*, const AtomicString&); + void RemoveSharedElement(Element*); + + // Notifies when the transition is initiated. + void Capture(); // Notifies when caching snapshots for elements in the old DOM finishes. This // is dispatched before script is notified to ensure this class releases any // references to elements in the old DOM before it is mutated by script. - void PrepareResolved(); + void CaptureResolved(); // Notifies when the new DOM has finished loading and a transition can be - // started. |elements| is the set of shared elements in the new DOM paired - // sequentially with the list of |elements| in the Prepare call. - void Start(const HeapVector<Member<Element>>& new_elements); + // started. + void Start(); // Notifies when the animation setup for the transition during Start have // finished executing. @@ -58,13 +60,12 @@ // is initiated. void Abort(); - // Returns the resource id that |element| should be tagged with. This - // |element| must be a shared element in the current DOM (specified in Prepare - // or Start). - viz::SharedElementResourceId GetLiveSnapshotId(const Element* element) const; + void UpdateRootIndexAndSnapshotId(DocumentTransitionSharedElementId&, + viz::SharedElementResourceId&) const; - // Returns the resource id for the root stacking context. - viz::SharedElementResourceId GetLiveRootSnapshotId() const; + void UpdateElementIndicesAndSnapshotId(Element*, + DocumentTransitionSharedElementId&, + viz::SharedElementResourceId&) const; // Creates a PseudoElement for the corresponding |pseudo_id| and // |document_transition_tag|. The |pseudo_id| must be a ::transition* element. @@ -99,12 +100,20 @@ EffectPaintPropertyNode* GetEffect(Element* element) const; EffectPaintPropertyNode* GetRootEffect() const; + void VerifySharedElements(); + + int PendingSharedElementCount() const { + return pending_shared_elements_.size(); + } + + bool IsSharedElement(Element* element) const; + private: class ImageWrapperPseudoElement; // These state transitions are executed in a serial order unless the // transition is aborted. - enum class State { kIdle, kPreparing, kPrepared, kStarted, kFinished }; + enum class State { kIdle, kCapturing, kCaptured, kStarted, kFinished }; struct ElementData : public GarbageCollected<ElementData> { void Trace(Visitor* visitor) const; @@ -131,15 +140,21 @@ // An effect used to represent the `target_element`'s contents, including // any of element's own effects, in a pseudo element layer. scoped_refptr<EffectPaintPropertyNode> effect_node; + + // Index to add to the document transition shared element id. + int element_index; }; void InvalidateStyle(); bool HasLiveNewContent() const; void EndTransition(); + void AddConsoleError(AtomicString message, Vector<DOMNodeId> related_nodes); + Member<Document> document_; State state_ = State::kIdle; - Vector<AtomicString> pseudo_document_transition_tags_; + VectorOf<AtomicString> pseudo_document_transition_tags_; + VectorOf<Element> pending_shared_elements_; HeapHashMap<AtomicString, Member<ElementData>> element_data_map_; viz::SharedElementResourceId old_root_snapshot_id_; viz::SharedElementResourceId new_root_snapshot_id_;
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc b/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc index d7349c6b..456b39f 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_supplement.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/document_transition/document_transition_supplement.h" #include "cc/document_transition/document_transition_request.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_callback.h" #include "third_party/blink/renderer/core/document_transition/document_transition.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -33,13 +34,25 @@ } // static -DocumentTransition* DocumentTransitionSupplement::documentTransition( +DocumentTransition* DocumentTransitionSupplement::EnsureDocumentTransition( Document& document) { auto* supplement = From(document); DCHECK(supplement->GetTransition()); return supplement->GetTransition(); } +// static +void DocumentTransitionSupplement::createDocumentTransition( + Document& document, + V8DocumentTransitionCallback* callback) { + auto* transition = EnsureDocumentTransition(document); + // TODO(vmpstr): We need to figure what to do if we already have a transition. + if (transition->HasActiveTransition()) + return; + auto script_scope = transition->CreateScriptMutationsAllowedScope(); + callback->InvokeAndReportException(&document, transition); +} + DocumentTransition* DocumentTransitionSupplement::GetTransition() { return transition_; }
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_supplement.h b/third_party/blink/renderer/core/document_transition/document_transition_supplement.h index c998dbcb..a18d0a3 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_supplement.h +++ b/third_party/blink/renderer/core/document_transition/document_transition_supplement.h
@@ -12,6 +12,7 @@ namespace blink { class DocumentTransition; +class V8DocumentTransitionCallback; class CORE_EXPORT DocumentTransitionSupplement : public GarbageCollected<DocumentTransitionSupplement>, @@ -23,7 +24,10 @@ static DocumentTransitionSupplement* From(Document&); static DocumentTransitionSupplement* FromIfExists(Document&); - static DocumentTransition* documentTransition(Document&); + static DocumentTransition* EnsureDocumentTransition(Document&); + + static void createDocumentTransition(Document&, + V8DocumentTransitionCallback* callback); DocumentTransition* GetTransition();
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_supplement.idl b/third_party/blink/renderer/core/document_transition/document_transition_supplement.idl index ff7541ff..7d9578dd 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_supplement.idl +++ b/third_party/blink/renderer/core/document_transition/document_transition_supplement.idl
@@ -6,5 +6,5 @@ ImplementedAs=DocumentTransitionSupplement, RuntimeEnabled=DocumentTransition ] partial interface Document { - [SameObject, MeasureAs=DocumentTransition] readonly attribute DocumentTransition documentTransition; + [MeasureAs=DocumentTransition] void createDocumentTransition(DocumentTransitionCallback callback); };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_test.cc b/third_party/blink/renderer/core/document_transition/document_transition_test.cc index 8e1d0dd..c592450 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_test.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_test.cc
@@ -12,9 +12,7 @@ #include "third_party/blink/public/web/web_settings.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_prepare_options.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_start_options.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_root_transition_type.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_set_element_options.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/document_transition/document_transition_supplement.h" @@ -109,14 +107,14 @@ void FinishTransition() { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); transition->NotifyStartFinished(transition->last_start_sequence_id_); } bool ShouldCompositeForDocumentTransition(Element* e) { auto* layout_object = e->GetLayoutObject(); auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); return layout_object && transition && transition->IsTransitionParticipant(*layout_object); } @@ -175,9 +173,9 @@ TEST_P(DocumentTransitionTest, TransitionObjectPersists) { auto* first_transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); auto* second_transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); EXPECT_TRUE(first_transition); EXPECT_EQ(GetState(first_transition), State::kIdle); @@ -186,9 +184,9 @@ } TEST_P(DocumentTransitionTest, TransitionPreparePromiseResolves) { - DocumentTransitionPrepareOptions options; auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); ASSERT_TRUE(transition); EXPECT_EQ(GetState(transition), State::kIdle); @@ -197,35 +195,32 @@ ExceptionState& exception_state = v8_scope.GetExceptionState(); ScriptPromiseTester promise_tester( - script_state, - transition->prepare(script_state, &options, exception_state)); + script_state, transition->captureAndHold(script_state, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + EXPECT_EQ(GetState(transition), State::kCapturing); UpdateAllLifecyclePhasesAndFinishDirectives(); promise_tester.WaitUntilSettled(); EXPECT_TRUE(promise_tester.IsFulfilled()); - EXPECT_EQ(GetState(transition), State::kPrepared); + EXPECT_EQ(GetState(transition), State::kCaptured); } TEST_P(DocumentTransitionTest, AdditionalPrepareRejectsPreviousPromise) { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions options; ScriptPromiseTester first_promise_tester( - script_state, - transition->prepare(script_state, &options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); ScriptPromiseTester second_promise_tester( - script_state, - transition->prepare(script_state, &options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); UpdateAllLifecyclePhasesAndFinishDirectives(); first_promise_tester.WaitUntilSettled(); @@ -233,37 +228,7 @@ EXPECT_TRUE(first_promise_tester.IsRejected()); EXPECT_TRUE(second_promise_tester.IsFulfilled()); - EXPECT_EQ(GetState(transition), State::kPrepared); -} - -TEST_P(DocumentTransitionTest, EffectParsing) { - // Test default init. - auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); - - V8TestingScope v8_scope; - ScriptState* script_state = v8_scope.GetScriptState(); - ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions default_options; - transition->prepare(script_state, &default_options, exception_state); - - auto request = transition->TakePendingRequest(); - ASSERT_TRUE(request); - - auto directive = request->ConstructDirective({}); - EXPECT_EQ(directive.effect(), DocumentTransitionRequest::Effect::kNone); - - // Test "explode" effect parsing. - DocumentTransitionPrepareOptions explode_options; - explode_options.setRootTransition( - V8RootTransitionType(V8RootTransitionType::Enum::kExplode)); - transition->prepare(script_state, &explode_options, exception_state); - - request = transition->TakePendingRequest(); - ASSERT_TRUE(request); - - directive = request->ConstructDirective({}); - EXPECT_EQ(directive.effect(), DocumentTransitionRequest::Effect::kExplode); + EXPECT_EQ(GetState(transition), State::kCaptured); } TEST_P(DocumentTransitionTest, PrepareSharedElementsWantToBeComposited) { @@ -282,7 +247,8 @@ auto* e3 = GetDocument().getElementById("e3"); auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); @@ -292,10 +258,9 @@ EXPECT_FALSE(ShouldCompositeForDocumentTransition(e2)); EXPECT_FALSE(ShouldCompositeForDocumentTransition(e3)); - DocumentTransitionPrepareOptions options; - // Set two of the elements to be shared. - options.setSharedElements({e1, e3}); - transition->prepare(script_state, &options, exception_state); + transition->setElement(script_state, e1, "e1", nullptr, exception_state); + transition->setElement(script_state, e3, "e3", nullptr, exception_state); + transition->captureAndHold(script_state, exception_state); // Update the lifecycle while keeping the transition active. UpdateAllLifecyclePhasesForTest(); @@ -336,7 +301,8 @@ auto* e3 = GetDocument().getElementById("e3"); auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); @@ -346,9 +312,10 @@ EXPECT_FALSE(ShouldCompositeForDocumentTransition(e2)); EXPECT_FALSE(ShouldCompositeForDocumentTransition(e3)); - DocumentTransitionPrepareOptions options; - options.setSharedElements({e1, e2, e3}); - transition->prepare(script_state, &options, exception_state); + transition->setElement(script_state, e1, "e1", nullptr, exception_state); + transition->setElement(script_state, e2, "e2", nullptr, exception_state); + transition->setElement(script_state, e3, "e3", nullptr, exception_state); + transition->captureAndHold(script_state, exception_state); EXPECT_TRUE(ShouldCompositeForDocumentTransition(e1)); EXPECT_TRUE(ShouldCompositeForDocumentTransition(e2)); @@ -367,44 +334,6 @@ EXPECT_FALSE(ElementIsComposited("e3")); } -TEST_P(DocumentTransitionTest, StartSharedElementCountMismatch) { - SetHtmlInnerHTML(R"HTML( - <div id=e1></div> - <div id=e2></div> - <div id=e3></div> - )HTML"); - - auto* e1 = GetDocument().getElementById("e1"); - auto* e2 = GetDocument().getElementById("e2"); - auto* e3 = GetDocument().getElementById("e3"); - - auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); - - V8TestingScope v8_scope; - ScriptState* script_state = v8_scope.GetScriptState(); - ExceptionState& exception_state = v8_scope.GetExceptionState(); - - DocumentTransitionPrepareOptions prepare_options; - // Set two of the elements to be shared. - prepare_options.setSharedElements({e1, e3}); - transition->prepare(script_state, &prepare_options, exception_state); - - UpdateAllLifecyclePhasesAndFinishDirectives(); - - DocumentTransitionStartOptions start_options; - // Set all of the elements as shared. This should cause an exception. - start_options.setSharedElements({e1, e2, e3}); - - EXPECT_FALSE(exception_state.HadException()); - transition->start(script_state, &start_options, exception_state); - EXPECT_TRUE(exception_state.HadException()); - - EXPECT_FALSE(ShouldCompositeForDocumentTransition(e1)); - EXPECT_FALSE(ShouldCompositeForDocumentTransition(e2)); - EXPECT_FALSE(ShouldCompositeForDocumentTransition(e3)); -} - TEST_P(DocumentTransitionTest, StartSharedElementsWantToBeComposited) { SetHtmlInnerHTML(R"HTML( <div id=e1></div> @@ -417,16 +346,17 @@ auto* e3 = GetDocument().getElementById("e3"); auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions prepare_options; // Set two of the elements to be shared. - prepare_options.setSharedElements({e1, e3}); - transition->prepare(script_state, &prepare_options, exception_state); + transition->setElement(script_state, e1, "e1", nullptr, exception_state); + transition->setElement(script_state, e3, "e3", nullptr, exception_state); + transition->captureAndHold(script_state, exception_state); EXPECT_TRUE(ShouldCompositeForDocumentTransition(e1)); EXPECT_FALSE(ShouldCompositeForDocumentTransition(e2)); @@ -434,10 +364,14 @@ UpdateAllLifecyclePhasesAndFinishDirectives(); - DocumentTransitionStartOptions start_options; // Set two different elements as shared. - start_options.setSharedElements({e1, e2}); - transition->start(script_state, &start_options, exception_state); + // Unset e3. + transition->setElement(script_state, e3, AtomicString(), nullptr, + exception_state); + // Set e2 to be the same tag as "e3". + // TODO(vmpstr): We should be able to support new tags for entry transitions. + transition->setElement(script_state, e2, "e3", nullptr, exception_state); + transition->start(script_state, exception_state); EXPECT_TRUE(ShouldCompositeForDocumentTransition(e1)); EXPECT_TRUE(ShouldCompositeForDocumentTransition(e2)); @@ -452,32 +386,30 @@ TEST_P(DocumentTransitionTest, AdditionalPrepareAfterPreparedSucceeds) { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions options; ScriptPromiseTester first_promise_tester( - script_state, - transition->prepare(script_state, &options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); UpdateAllLifecyclePhasesAndFinishDirectives(); first_promise_tester.WaitUntilSettled(); EXPECT_TRUE(first_promise_tester.IsFulfilled()); - EXPECT_EQ(GetState(transition), State::kPrepared); + EXPECT_EQ(GetState(transition), State::kCaptured); ScriptPromiseTester second_promise_tester( - script_state, - transition->prepare(script_state, &options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); UpdateAllLifecyclePhasesAndFinishDirectives(); second_promise_tester.WaitUntilSettled(); EXPECT_TRUE(second_promise_tester.IsFulfilled()); - EXPECT_EQ(GetState(transition), State::kPrepared); + EXPECT_EQ(GetState(transition), State::kCaptured); } TEST_P(DocumentTransitionTest, TransitionCleanedUpBeforePromiseResolution) { @@ -485,11 +417,11 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions options; + auto* transition = + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); ScriptPromiseTester tester( - script_state, - DocumentTransitionSupplement::documentTransition(GetDocument()) - ->prepare(script_state, &options, exception_state)); + script_state, transition->captureAndHold(script_state, exception_state)); // ActiveScriptWrappable should keep the transition alive. ThreadState::Current()->CollectAllGarbageForTesting(); @@ -501,7 +433,8 @@ TEST_P(DocumentTransitionTest, StartHasNoEffectUnlessPrepared) { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); EXPECT_EQ(GetState(transition), State::kIdle); EXPECT_FALSE(transition->TakePendingRequest()); @@ -509,8 +442,7 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionStartOptions options; - transition->start(script_state, &options, exception_state); + transition->start(script_state, exception_state); EXPECT_EQ(GetState(transition), State::kIdle); EXPECT_FALSE(transition->TakePendingRequest()); EXPECT_TRUE(exception_state.HadException()); @@ -518,27 +450,24 @@ TEST_P(DocumentTransitionTest, StartAfterPrepare) { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions prepare_options; - ScriptPromiseTester prepare_tester( - script_state, - transition->prepare(script_state, &prepare_options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + ScriptPromiseTester capture_tester( + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); UpdateAllLifecyclePhasesAndFinishDirectives(); - prepare_tester.WaitUntilSettled(); - EXPECT_TRUE(prepare_tester.IsFulfilled()); - EXPECT_EQ(GetState(transition), State::kPrepared); + capture_tester.WaitUntilSettled(); + EXPECT_TRUE(capture_tester.IsFulfilled()); + EXPECT_EQ(GetState(transition), State::kCaptured); - DocumentTransitionStartOptions start_options; ScriptPromiseTester start_tester( - script_state, - transition->start(script_state, &start_options, exception_state)); + script_state, transition->start(script_state, exception_state)); // Take the request. auto start_request = transition->TakePendingRequest(); EXPECT_TRUE(start_request); @@ -546,7 +475,7 @@ // Subsequent starts should get an exception. EXPECT_FALSE(exception_state.HadException()); - transition->start(script_state, &start_options, exception_state); + transition->start(script_state, exception_state); EXPECT_TRUE(exception_state.HadException()); EXPECT_FALSE(transition->TakePendingRequest()); @@ -558,33 +487,30 @@ TEST_P(DocumentTransitionTest, StartPromiseIsResolved) { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions prepare_options; - ScriptPromiseTester prepare_tester( - script_state, - transition->prepare(script_state, &prepare_options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + ScriptPromiseTester capture_tester( + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); - // Visual updates are allows during prepare phase. + // Visual updates are allows during capture phase. EXPECT_FALSE(LayerTreeHost()->IsDeferringCommits()); UpdateAllLifecyclePhasesAndFinishDirectives(); - prepare_tester.WaitUntilSettled(); - EXPECT_TRUE(prepare_tester.IsFulfilled()); - EXPECT_EQ(GetState(transition), State::kPrepared); + capture_tester.WaitUntilSettled(); + EXPECT_TRUE(capture_tester.IsFulfilled()); + EXPECT_EQ(GetState(transition), State::kCaptured); - // Visual updates are stalled between prepared and start. + // Visual updates are stalled between captured and start. EXPECT_TRUE(LayerTreeHost()->IsDeferringCommits()); - DocumentTransitionStartOptions start_options; ScriptPromiseTester start_tester( - script_state, - transition->start(script_state, &start_options, exception_state)); + script_state, transition->start(script_state, exception_state)); EXPECT_EQ(GetState(transition), State::kStarted); UpdateAllLifecyclePhasesAndFinishDirectives(); @@ -598,26 +524,23 @@ EXPECT_EQ(GetState(transition), State::kIdle); } -TEST_P(DocumentTransitionTest, AbortSignal) { +TEST_P(DocumentTransitionTest, Abandon) { auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - auto* abort_signal = - MakeGarbageCollected<AbortSignal>(v8_scope.GetExecutionContext()); - DocumentTransitionPrepareOptions prepare_options; - prepare_options.setAbortSignal(abort_signal); - ScriptPromiseTester prepare_tester( - script_state, - transition->prepare(script_state, &prepare_options, exception_state)); - EXPECT_EQ(GetState(transition), State::kPreparing); + ScriptPromiseTester capture_tester( + script_state, transition->captureAndHold(script_state, exception_state)); + EXPECT_EQ(GetState(transition), State::kCapturing); - abort_signal->SignalAbort(script_state); - prepare_tester.WaitUntilSettled(); - EXPECT_TRUE(prepare_tester.IsRejected()); + transition->abandon(script_state, exception_state); + + capture_tester.WaitUntilSettled(); + EXPECT_TRUE(capture_tester.IsRejected()); EXPECT_EQ(GetState(transition), State::kIdle); } @@ -639,21 +562,23 @@ auto* e3 = GetDocument().getElementById("e3"); auto* transition = - DocumentTransitionSupplement::documentTransition(GetDocument()); + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + auto scope = transition->CreateScriptMutationsAllowedScope(); V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionPrepareOptions options; - options.setSharedElements({e1, e2, e3}); - transition->prepare(script_state, &options, exception_state); + transition->setElement(script_state, e1, "e1", nullptr, exception_state); + transition->setElement(script_state, e2, "e2", nullptr, exception_state); + transition->setElement(script_state, e3, "e3", nullptr, exception_state); + transition->captureAndHold(script_state, exception_state); ASSERT_FALSE(exception_state.HadException()); UpdateAllLifecyclePhasesForTest(); // The prepare phase should generate the pseudo tree. - const Vector<AtomicString> document_transition_tags = {"shared-0", "shared-1", - "shared-2"}; + const Vector<AtomicString> document_transition_tags = {"root", "e1", "e2", + "e3"}; ValidatePseudoElementTree(document_transition_tags, false); // Finish the prepare phase, mutate the DOM and start the animation. @@ -667,9 +592,7 @@ <div id=e2></div> <div id=e3></div> )HTML"); - DocumentTransitionStartOptions start_options; - start_options.setSharedElements({e1, e2, e3}); - transition->start(script_state, &start_options, exception_state); + transition->start(script_state, exception_state); ASSERT_FALSE(exception_state.HadException()); // The start phase should generate pseudo elements for rendering new live
diff --git a/third_party/blink/renderer/core/frame/dom_timer.cc b/third_party/blink/renderer/core/frame/dom_timer.cc index bd5283a..622879c 100644 --- a/third_party/blink/renderer/core/frame/dom_timer.cc +++ b/third_party/blink/renderer/core/frame/dom_timer.cc
@@ -102,7 +102,7 @@ TaskType task_type; if (timeout.is_zero()) { task_type = TaskType::kJavascriptTimerImmediate; - DCHECK_LT(nesting_level_, kMaxTimerNestingLevel); + DCHECK_LT(nesting_level_, max_nesting_level); } else if (nesting_level_ >= kMaxTimerNestingLevel) { task_type = TaskType::kJavascriptTimerDelayedHighNesting; } else { @@ -184,7 +184,11 @@ // Make adjustments when the nesting level becomes >= |kMaxNestingLevel|. // Note: The implementation uses >= instead of >, contrary to what the spec // requires crbug.com/1108877. - if (nesting_level_ == kMaxTimerNestingLevel) { + int max_nesting_level = + features::IsMaxUnthrottledTimeoutNestingLevelEnabled() + ? features::GetMaxUnthrottledTimeoutNestingLevel() + : kMaxTimerNestingLevel; + if (nesting_level_ == max_nesting_level) { // Move to the TaskType that corresponds to nesting level >= // |kMaxNestingLevel|. MoveToNewTaskRunner( @@ -194,7 +198,7 @@ AugmentRepeatInterval(kMinimumInterval - RepeatInterval()); } - DCHECK(nesting_level_ < kMaxTimerNestingLevel || + DCHECK(nesting_level_ < max_nesting_level || RepeatInterval() >= kMinimumInterval); // No access to member variables after this point, it can delete the timer.
diff --git a/third_party/blink/renderer/core/frame/dom_timer_test.cc b/third_party/blink/renderer/core/frame/dom_timer_test.cc index dba92a1..3d53185 100644 --- a/third_party/blink/renderer/core/frame/dom_timer_test.cc +++ b/third_party/blink/renderer/core/frame/dom_timer_test.cc
@@ -136,6 +136,10 @@ TEST_F(DOMTimerTest, setTimeout_ClampsAfter4Nestings) { v8::HandleScope scope(v8::Isolate::GetCurrent()); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + features::kMaxUnthrottledTimeoutNestingLevel); + ExecuteScriptAndWaitUntilIdle(kSetTimeoutNestedScriptText); auto times(ToDoubleArray(EvalExpression("times"), scope)); @@ -159,6 +163,10 @@ TEST_F(DOMTimerTest, setInterval_ClampsAfter4Iterations) { v8::HandleScope scope(v8::Isolate::GetCurrent()); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + features::kMaxUnthrottledTimeoutNestingLevel); + ExecuteScriptAndWaitUntilIdle(kSetIntervalScriptText); auto times(ToDoubleArray(EvalExpression("times"), scope)); @@ -166,9 +174,34 @@ EXPECT_THAT(times, ElementsAreArray(kExpectedTimings)); } +TEST_F(DOMTimerTest, setInterval_ClampsAfter5Iterations) { + v8::HandleScope scope(v8::Isolate::GetCurrent()); + + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + features::kMaxUnthrottledTimeoutNestingLevel, {{"nesting", "6"}}); + + ExecuteScriptAndWaitUntilIdle(kSetIntervalScriptText); + + auto times(ToDoubleArray(EvalExpression("times"), scope)); + + EXPECT_THAT(times, ElementsAreArray({ + DoubleNear(1., kThreshold), + DoubleNear(1., kThreshold), + DoubleNear(1., kThreshold), + DoubleNear(1., kThreshold), + DoubleNear(1., kThreshold), + DoubleNear(4., kThreshold), + })); +} + TEST_F(DOMTimerTest, setInterval_NestingResetsForLaterCalls) { v8::HandleScope scope(v8::Isolate::GetCurrent()); + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + features::kMaxUnthrottledTimeoutNestingLevel); + ExecuteScriptAndWaitUntilIdle(kSetIntervalScriptText); // Run the setIntervalScript again to verify that the clamp imposed for
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_helpers.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_helpers.cc index 6ea59d05..917a02e 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_helpers.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_helpers.cc
@@ -1033,33 +1033,12 @@ NGTableTypes::Rows* rows) { if (sections->IsEmpty()) return; - // Redistribute table block size over sections algorithm: - // Compute section size guesses: - // min_guess_sum is sum of section sizes - // percentage_guess_sum is sum of kMinGuess + percentage guesses - // if table_block_size <= min_guess_sum, there is nothing to distribute. - - // 1. if table_block_size > min_guess_sum distribute size to - // percentage sections. - // Sections grow in proportion to difference between their percentage - // size and min size. - // - // 2. if table_block_size > percentage_guess_sum distribute size to - // eligible sections. - // Eligible sections: - // if TBODY sections exist, only TBODY sections are eligible. - // otherwise, all sections are eligible. - // - // - grow auto eligible sections in proportion to their size - // - grow fixed eligible sections in proportion to their size - // - grow percentage eligible sections in proportion to their size - - unsigned block_space_count = sections->size() + 1; - LayoutUnit undistributable_space = block_space_count * border_block_spacing; - - LayoutUnit distributable_table_block_size = - std::max(LayoutUnit(), table_block_size - undistributable_space); + // Determine the table's block-size which we can distribute into. + const LayoutUnit undistributable_space = + (sections->size() + 1) * border_block_spacing; + const LayoutUnit distributable_table_block_size = + (table_block_size - undistributable_space).ClampNegativeToZero(); auto ComputePercentageSize = [&distributable_table_block_size]( auto& section) { @@ -1069,186 +1048,160 @@ LayoutUnit(*section.percent * distributable_table_block_size / 100)); }; + LayoutUnit minimum_size_guess; + LayoutUnit percent_size_guess; + bool has_tbody = false; + + Vector<wtf_size_t> auto_sections; + Vector<wtf_size_t> fixed_sections; + Vector<wtf_size_t> percent_sections; + Vector<wtf_size_t> tbody_auto_sections; + Vector<wtf_size_t> tbody_fixed_sections; + Vector<wtf_size_t> tbody_percent_sections; + LayoutUnit auto_sections_size; LayoutUnit fixed_sections_size; LayoutUnit percent_sections_size; LayoutUnit tbody_auto_sections_size; LayoutUnit tbody_fixed_sections_size; LayoutUnit tbody_percent_sections_size; - LayoutUnit minimum_size_guess; - LayoutUnit percent_size_guess; - unsigned auto_sections_count = 0; - unsigned fixed_sections_count = 0; - unsigned percent_sections_count = 0; - unsigned tbody_auto_sections_count = 0; - unsigned tbody_fixed_sections_count = 0; - unsigned tbody_percent_sections_count = 0; - - for (const NGTableTypes::Section& section : *sections) { + // Collect all our different section types. + for (wtf_size_t index = 0u; index < sections->size(); ++index) { + const auto& section = sections->at(index); minimum_size_guess += section.block_size; - if (section.percent.has_value()) - percent_size_guess += ComputePercentageSize(section); - else - percent_size_guess += section.block_size; + percent_size_guess += + section.percent ? ComputePercentageSize(section) : section.block_size; + has_tbody |= section.is_tbody; - if (section.is_constrained) { - if (section.percent.has_value()) { - percent_sections_count++; - if (section.is_tbody) - tbody_percent_sections_count++; - } else { - fixed_sections_count++; - fixed_sections_size += section.block_size; - if (section.is_tbody) { - tbody_fixed_sections_size += section.block_size; - tbody_fixed_sections_count++; - } + if (section.percent) { + percent_sections.push_back(index); + if (section.is_tbody) + tbody_percent_sections.push_back(index); + } else if (section.is_constrained) { + fixed_sections.push_back(index); + fixed_sections_size += section.block_size; + if (section.is_tbody) { + tbody_fixed_sections.push_back(index); + tbody_fixed_sections_size += section.block_size; } } else { - auto_sections_count++; + auto_sections.push_back(index); auto_sections_size += section.block_size; if (section.is_tbody) { - tbody_auto_sections_count++; + tbody_auto_sections.push_back(index); tbody_auto_sections_size += section.block_size; } } } + // If the sections minimum size is greater than the distributable size - + // there isn't any free space to distribute into. if (distributable_table_block_size <= minimum_size_guess) return; - LayoutUnit current_sections_size = minimum_size_guess; - - // Distribute to percent sections. - if (percent_sections_count > 0 && percent_size_guess > minimum_size_guess) { - LayoutUnit distributable_size = + // Grow the (all) the percent sections up to what the percent specifies, and + // in proportion to the *difference* between their percent size, and their + // minimum size. E.g. + // + // <table style="height: 100px;"> + // <tbody style="height: 50%;"></tbody> + // </table> + // The above <tbody> will grow to 50px. + // + // <table style="height: 100px;"> + // <thead style="height: 50%;"></thead> + // <tbody style="height: 50%;"><td style="height: 60px;"></td></tbody> + // <tfoot style="height: 50%;"></tfoot> + // </table> + // The sections will be [20px, 60px, 20px]. The <tbody> doesn't grow as its + // hit its minimum, remaining space distributed according to their percent. + if (!percent_sections.IsEmpty() && percent_size_guess > minimum_size_guess) { + const LayoutUnit distributable_size = std::min(percent_size_guess, distributable_table_block_size) - minimum_size_guess; DCHECK_GE(distributable_size, LayoutUnit()); - LayoutUnit percent_minimum_difference = + const LayoutUnit percent_minimum_difference = percent_size_guess - minimum_size_guess; - LayoutUnit rounding_error_tally = distributable_size; - NGTableTypes::Section* last_section = nullptr; - for (NGTableTypes::Section& section : *sections) { - if (!section.percent) - continue; - LayoutUnit delta = LayoutUnit( - distributable_size * - (ComputePercentageSize(section).ToFloat() - section.block_size) / + LayoutUnit remaining_deficit = distributable_size; + for (auto& index : percent_sections) { + auto& section = sections->at(index); + LayoutUnit delta = distributable_size.MulDiv( + ComputePercentageSize(section) - section.block_size, percent_minimum_difference); section.block_size += delta; section.needs_redistribution = true; - rounding_error_tally -= delta; - current_sections_size += delta; - last_section = §ion; + remaining_deficit -= delta; + minimum_size_guess += delta; percent_sections_size += section.block_size; if (section.is_tbody) tbody_percent_sections_size += section.block_size; } - DCHECK_LT(rounding_error_tally, - LayoutUnit(1)); // DO NOT CHECK IN, cluster fuzz magnet - DCHECK(last_section); - last_section->block_size += rounding_error_tally; - percent_sections_size += rounding_error_tally; - current_sections_size += rounding_error_tally; - if (last_section->is_tbody) - percent_sections_size += rounding_error_tally; + auto& last_section = sections->at(percent_sections.back()); + last_section.block_size += remaining_deficit; + DCHECK_GE(last_section.block_size, LayoutUnit()); + percent_sections_size += remaining_deficit; + minimum_size_guess += remaining_deficit; + if (last_section.is_tbody) + tbody_percent_sections_size += remaining_deficit; } - // Distribute remaining sizes. - bool has_tbody = tbody_auto_sections_count > 0 || - tbody_fixed_sections_count > 0 || - tbody_percent_sections_count > 0; - LayoutUnit distributable_size = - distributable_table_block_size - current_sections_size; - if (distributable_size > LayoutUnit()) { - LayoutUnit rounding_error_tally = distributable_size; - if ((tbody_auto_sections_count > 0) || - (!has_tbody && auto_sections_count > 0)) { - // Distribute to auto sections. - // Sections grow by ratio of their size / total auto sizes. - NGTableTypes::Section* last_section = nullptr; - LayoutUnit total_auto_size = - has_tbody ? tbody_auto_sections_size : auto_sections_size; - for (NGTableTypes::Section& section : *sections) { - if (section.is_constrained || (section.is_tbody != has_tbody)) - continue; - LayoutUnit delta; - if (total_auto_size > LayoutUnit()) { - delta = LayoutUnit(distributable_size.ToFloat() * section.block_size / - total_auto_size); - } else { - delta = LayoutUnit( - distributable_size.ToFloat() / - (has_tbody ? tbody_auto_sections_count : auto_sections_count)); - } - section.block_size += delta; - section.needs_redistribution = true; - rounding_error_tally -= delta; - last_section = §ion; - } - DCHECK(last_section); - last_section->block_size += rounding_error_tally; - } else if ((tbody_fixed_sections_count > 0) || - (!has_tbody && fixed_sections_count > 0)) { - // Distribute to fixed sections. - // Sections grow by ration of their size / total fixed sizes. - NGTableTypes::Section* last_section = nullptr; - LayoutUnit total_fixed_size = - has_tbody ? tbody_fixed_sections_size : fixed_sections_size; - for (NGTableTypes::Section& section : *sections) { - if (!section.is_constrained || section.percent.has_value()) - continue; - if (section.is_tbody != has_tbody) - continue; - LayoutUnit delta; - if (total_fixed_size > LayoutUnit()) { - delta = LayoutUnit(distributable_size.ToFloat() * section.block_size / - total_fixed_size); - } else { - delta = LayoutUnit( - distributable_size.ToFloat() / - (has_tbody ? tbody_fixed_sections_count : fixed_sections_count)); - } - section.block_size += delta; - section.needs_redistribution = true; - rounding_error_tally -= delta; - last_section = §ion; - } - DCHECK(last_section); - last_section->block_size += rounding_error_tally; + // Decide which sections to grow, we prefer any <tbody>-like sections over + // headers/footers. Then in order: + // - auto sections. + // - fixed sections. + // - percent sections. + Vector<wtf_size_t>* sections_to_grow; + LayoutUnit sections_size; + if (has_tbody) { + if (!tbody_auto_sections.IsEmpty()) { + sections_to_grow = &tbody_auto_sections; + sections_size = tbody_auto_sections_size; + } else if (!tbody_fixed_sections.IsEmpty()) { + sections_to_grow = &tbody_fixed_sections; + sections_size = tbody_fixed_sections_size; } else { - DCHECK((tbody_percent_sections_count > 0) || - (!has_tbody && percent_sections_count > 0)); - // Distribute to percentage sections. - NGTableTypes::Section* last_section = nullptr; - LayoutUnit total_percent_size = - has_tbody ? tbody_percent_sections_size : percent_sections_size; - for (NGTableTypes::Section& section : *sections) { - if (!section.percent.has_value()) - continue; - if (section.is_tbody != has_tbody) - continue; - LayoutUnit delta; - if (total_percent_size > LayoutUnit()) { - delta = LayoutUnit(distributable_size.ToFloat() * section.block_size / - total_percent_size); - } else { - delta = LayoutUnit(distributable_size.ToFloat() / - (has_tbody ? tbody_percent_sections_count - : percent_sections_count)); - } - section.block_size += delta; - section.needs_redistribution = true; - rounding_error_tally -= delta; - last_section = §ion; - } - DCHECK(last_section); - last_section->block_size += rounding_error_tally; + DCHECK(!tbody_percent_sections.IsEmpty()); + sections_to_grow = &tbody_percent_sections; + sections_size = tbody_percent_sections_size; + } + } else { + if (!auto_sections.IsEmpty()) { + sections_to_grow = &auto_sections; + sections_size = auto_sections_size; + } else if (!fixed_sections.IsEmpty()) { + sections_to_grow = &fixed_sections; + sections_size = fixed_sections_size; + } else { + DCHECK(!percent_sections.IsEmpty()); + sections_to_grow = &percent_sections; + sections_size = percent_sections_size; } } + + // Distribute remaining size, evenly across the sections. + LayoutUnit distributable_size = + distributable_table_block_size - minimum_size_guess; + if (distributable_size > LayoutUnit()) { + LayoutUnit remaining_deficit = distributable_size; + for (auto& index : *sections_to_grow) { + auto& section = sections->at(index); + LayoutUnit delta; + if (sections_size > LayoutUnit()) { + delta = distributable_size.MulDiv(section.block_size, sections_size); + } else { + delta = distributable_size / sections_to_grow->size(); + } + section.block_size += delta; + section.needs_redistribution = true; + remaining_deficit -= delta; + } + auto& last_section = sections->at(sections_to_grow->back()); + last_section.block_size += remaining_deficit; + DCHECK_GE(last_section.block_size, LayoutUnit()); + } + // Propagate new section sizes to rows. for (NGTableTypes::Section& section : *sections) { if (!section.needs_redistribution)
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index bcb05d30..5055161 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -905,16 +905,31 @@ UpdateScrollOrigin(); } -void PaintLayerScrollableArea::UpdateScrollbarEnabledState() { +void PaintLayerScrollableArea::UpdateScrollbarEnabledState( + bool is_horizontal_scrollbar_frozen, + bool is_vertical_scrollbar_frozen) { bool force_disable = GetPageScrollbarTheme().ShouldDisableInvisibleScrollbars() && ScrollbarsHiddenIfOverlay(); - if (HorizontalScrollbar()) - HorizontalScrollbar()->SetEnabled(HasHorizontalOverflow() && - !force_disable); - if (VerticalScrollbar()) - VerticalScrollbar()->SetEnabled(HasVerticalOverflow() && !force_disable); + // Don't update the enabled state of a custom scrollbar if that scrollbar + // is frozen. Otherwise re-running the style cascade with the change in + // :disabled pseudo state matching for custom scrollbars can cause infinite + // loops in layout. + if (Scrollbar* horizontal_scrollbar = HorizontalScrollbar()) { + if (!horizontal_scrollbar->IsCustomScrollbar() || + !is_horizontal_scrollbar_frozen) { + horizontal_scrollbar->SetEnabled(HasHorizontalOverflow() && + !force_disable); + } + } + + if (Scrollbar* vertical_scrollbar = VerticalScrollbar()) { + if (!vertical_scrollbar->IsCustomScrollbar() || + !is_vertical_scrollbar_frozen) { + vertical_scrollbar->SetEnabled(HasVerticalOverflow() && !force_disable); + } + } } void PaintLayerScrollableArea::UpdateScrollbarProportions() { @@ -1062,7 +1077,8 @@ // the data changes, then this will try to re-snap. SetSnapContainerDataNeedsUpdate(true); { - UpdateScrollbarEnabledState(); + UpdateScrollbarEnabledState(is_horizontal_scrollbar_frozen, + is_vertical_scrollbar_frozen); UpdateScrollbarProportions(); }
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h index 30811b4..9cd0056 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -625,7 +625,8 @@ void ResetScrollOriginChanged() { scroll_origin_changed_ = false; } void UpdateScrollOrigin(); void UpdateScrollDimensions(); - void UpdateScrollbarEnabledState(); + void UpdateScrollbarEnabledState(bool is_horizontal_scrollbar_frozen = false, + bool is_vertical_scrollbar_frozen = false); // Update the proportions used for thumb rect dimensions. void UpdateScrollbarProportions();
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index f8a9d459..6aa21a45 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -2649,7 +2649,8 @@ } bool ComputedStyle::CanMatchSizeContainerQueries(const Element& element) const { - return IsContainerForSizeContainerQueries() && + return RuntimeEnabledFeatures::LayoutNGEnabled() && + IsContainerForSizeContainerQueries() && !InsideFragmentationContextWithNondeterministicEngine() && !element.ShouldForceLegacyLayout() && (!element.IsSVGElement() ||
diff --git a/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc b/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc index b3caefd5..c8f83c7e 100644 --- a/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.cc
@@ -120,7 +120,7 @@ } void WebTestWebFrameWidgetImpl::DisableEndDocumentTransition() { - DocumentTransitionSupplement::documentTransition( + DocumentTransitionSupplement::EnsureDocumentTransition( *LocalRootImpl()->GetFrame()->GetDocument()) ->DisableEndTransition(); }
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc index 3d7c0b2..e61fbd3 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
@@ -98,7 +98,6 @@ mojom::blink::PublicKeyCredentialRequestOptions; using mojom::blink::GetAssertionAuthenticatorResponsePtr; using mojom::blink::RequestIdTokenStatus; -using mojom::blink::RequestMode; using payments::mojom::blink::PaymentCredentialStorageStatus; constexpr char kCryptotokenOrigin[] = @@ -858,14 +857,6 @@ return true; } -RequestMode ToRequestMode(const String& mode) { - if (mode == "mediated") { - return RequestMode::kMediated; - } else { - return RequestMode::kPermission; - } -} - void OnRequestIdToken(ScriptPromiseResolver* resolver, RequestIdTokenStatus status, const WTF::String& id_token) { @@ -1190,8 +1181,7 @@ auto* fedcm_get_request = CredentialManagerProxy::From(script_state)->FedCmGetRequest(); fedcm_get_request->RequestIdToken( - provider_url, client_id, nonce, - ToRequestMode(options->federated()->mode()), prefer_auto_sign_in, + provider_url, client_id, nonce, prefer_auto_sign_in, WTF::Bind(&OnRequestIdToken, WrapPersistent(resolver))); return promise; }
diff --git a/third_party/blink/renderer/modules/credentialmanager/federated_credential_request_options.idl b/third_party/blink/renderer/modules/credentialmanager/federated_credential_request_options.idl index a35aa05..e572171 100644 --- a/third_party/blink/renderer/modules/credentialmanager/federated_credential_request_options.idl +++ b/third_party/blink/renderer/modules/credentialmanager/federated_credential_request_options.idl
@@ -2,15 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -enum Mode { - "mediated", - "permission" -}; - // https://w3c.github.io/webappsec-credential-management/#dictdef-federatedcredentialrequestoptions dictionary FederatedCredentialRequestOptions { sequence<(DOMString or FederatedIdentityProvider)> providers; sequence<DOMString> protocols; - Mode mode = "mediated"; boolean preferAutoSignIn = false; };
diff --git a/third_party/blink/renderer/modules/native_io/native_io_file.cc b/third_party/blink/renderer/modules/native_io/native_io_file.cc index 145256e..580c6b7b 100644 --- a/third_party/blink/renderer/modules/native_io/native_io_file.cc +++ b/third_party/blink/renderer/modules/native_io/native_io_file.cc
@@ -11,6 +11,7 @@ #include "base/location.h" #include "base/memory/scoped_refptr.h" #include "base/numerics/checked_math.h" +#include "base/synchronization/lock.h" #include "base/task/sequenced_task_runner.h" #include "base/task/thread_pool.h" #include "build/build_config.h" @@ -39,7 +40,6 @@ #include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" #include "third_party/blink/renderer/platform/wtf/functional.h" -#include "third_party/blink/renderer/platform/wtf/threading_primitives.h" #include "third_party/blink/renderer/platform/wtf/wtf.h" #if BUILDFLAG(IS_MAC) @@ -82,14 +82,14 @@ bool IsValid() { DCHECK(!IsMainThread()); - WTF::MutexLocker locker(mutex_); + base::AutoLock auto_lock(lock_); return file_.IsValid(); } void Close() { DCHECK(!IsMainThread()); - WTF::MutexLocker locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; file_.Close(); @@ -100,7 +100,7 @@ std::pair<int64_t, base::File::Error> GetLength() { DCHECK(!IsMainThread()); - WTF::MutexLocker mutex_locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; int64_t length = file_.GetLength(); @@ -116,7 +116,7 @@ DCHECK(!IsMainThread()); DCHECK_GE(expected_length, 0); - WTF::MutexLocker mutex_locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; bool success = file_.SetLength(expected_length); @@ -130,7 +130,7 @@ #if BUILDFLAG(IS_MAC) // Used to implement browser-side SetLength() on macOS < 10.15. base::File TakeFile() { - WTF::MutexLocker mutex_locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; return std::move(file_); @@ -138,7 +138,7 @@ // Used to implement browser-side SetLength() on macOS < 10.15. void SetFile(base::File file) { - WTF::MutexLocker locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(!file_.IsValid()) << __func__ << " called on valid file"; file_ = std::move(file); @@ -155,7 +155,7 @@ DCHECK_GE(file_offset, 0); DCHECK_GE(read_size, 0); - WTF::MutexLocker mutex_locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; int read_bytes = file_.Read(file_offset, buffer->Data(), read_size); @@ -177,7 +177,7 @@ DCHECK_GE(file_offset, 0); DCHECK_GE(write_size, 0); - WTF::MutexLocker mutex_locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; int written_bytes = file_.Write(file_offset, buffer->Data(), write_size); @@ -196,7 +196,7 @@ base::File::Error Flush() { DCHECK(!IsMainThread()); - WTF::MutexLocker mutex_locker(mutex_); + base::AutoLock auto_lock(lock_); DCHECK(file_.IsValid()) << __func__ << " called on invalid file"; bool success = file_.Flush(); @@ -205,10 +205,10 @@ private: // Lock coordinating cross-thread access to the state. - WTF::Mutex mutex_; + base::Lock lock_; // The file on disk backing this NativeIOFile. - base::File file_ GUARDED_BY(mutex_); + base::File file_ GUARDED_BY(lock_); }; NativeIOFile::NativeIOFile(
diff --git a/third_party/blink/tools/blinkpy/common/config/builders.json b/third_party/blink/tools/blinkpy/common/config/builders.json index 36c17f2..2615db8d 100644 --- a/third_party/blink/tools/blinkpy/common/config/builders.json +++ b/third_party/blink/tools/blinkpy/common/config/builders.json
@@ -64,6 +64,11 @@ "port_name": "win-win7", "specifiers": ["Win7", "Debug"] }, + "Win11 Tests x64": { + "master": "chromium.win", + "port_name": "win-win11", + "specifiers": ["Win11", "Release"] + }, "fuchsia_x64": { "master": "tryserver.chromium.linux", "port_name": "fuchsia",
diff --git a/third_party/blink/web_tests/ASANExpectations b/third_party/blink/web_tests/ASANExpectations index 1300010..8f14649e 100644 --- a/third_party/blink/web_tests/ASANExpectations +++ b/third_party/blink/web_tests/ASANExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Slow Skip ]
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 27453d4..4218e2c6 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -28,7 +28,7 @@ crbug.com/626703 external/wpt/webrtc-stats/rtp-stats-creation.html [ Crash Failure ] crbug.com/626703 external/wpt/domxpath/xpath-evaluate-crash.html [ Crash ] crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/media-autoplay.html [ Failure Timeout ] -crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/restrictions.html [ Timeout ] +crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/restrictions.html [ Failure Timeout ] crbug.com/626703 external/wpt/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html [ Failure ] crbug.com/626703 external/wpt/css/css-overflow/scrollbar-gutter-vertical-lr-002.html [ Failure ] crbug.com/626703 external/wpt/css/css-writing-modes/inline-box-orthogonal-child-with-margins.html [ Failure ] @@ -1332,6 +1332,8 @@ crbug.com/958381 external/wpt/css/css-tables/tentative/paint/collapsed-border-large-cell.html [ Failure ] crbug.com/958381 external/wpt/css/css-tables/tentative/position-sticky-container.html [ Failure ] crbug.com/958381 external/wpt/css/css-tables/tentative/rowspan-height-redistribution.html [ Failure ] +crbug.com/958381 external/wpt/css/css-tables/tentative/section-no-tbody-fixed-distribution.html [ Failure ] +crbug.com/958381 external/wpt/css/css-tables/tentative/section-no-tbody-percent-distribution.html [ Failure ] crbug.com/958381 external/wpt/css/css-tables/tentative/table-height-redistribution.html [ Failure ] crbug.com/958381 external/wpt/css/css-tables/tentative/table-minmax.html [ Failure ] crbug.com/958381 external/wpt/css/css-tables/tentative/table-width-redistribution.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials index c644222..3f64f143 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials +++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -63,7 +63,7 @@ crbug.com/626703 external/wpt/webrtc-stats/rtp-stats-creation.html [ Crash Failure ] crbug.com/626703 external/wpt/domxpath/xpath-evaluate-crash.html [ Crash ] crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/media-autoplay.html [ Failure Timeout ] -crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/restrictions.html [ Timeout ] +crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/restrictions.html [ Failure Timeout ] crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/oklch-008.html [ Failure ] crbug.com/626703 external/wpt/css/css-masking/mask-image/mask-composite-1c.html [ Crash Failure ] crbug.com/626703 external/wpt/selection/textcontrols/onselectionchange-content-attribute.html [ Timeout ]
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-percent-based-scrolling b/third_party/blink/web_tests/FlagExpectations/enable-percent-based-scrolling index 1f3124c..bcdde581 100644 --- a/third_party/blink/web_tests/FlagExpectations/enable-percent-based-scrolling +++ b/third_party/blink/web_tests/FlagExpectations/enable-percent-based-scrolling
@@ -14,11 +14,9 @@ crbug.com/1204176 fast/events/wheel/wheel-latched-scroll-node-removed.html [ Pass Timeout ] # fast/scrolling -crbug.com/1204176 fast/scrolling/hover-during-scroll.html [ Failure ] crbug.com/1204176 fast/scrolling/overflow-scrollability.html [ Failure ] crbug.com/1204176 fast/scrolling/wheel-and-touch-scroll-use-count.html [ Failure ] crbug.com/1204176 fast/scrolling/fractional-scroll-offset-document.html [ Failure ] -crbug.com/1204176 fast/scrolling/no-hover-during-smooth-keyboard-scroll.html [ Failure ] crbug.com/1204176 fast/scrolling/scroll-animation-on-by-default.html [ Failure ] crbug.com/1204176 fast/scrolling/wheel-scroll-latching-on-scrollbar.html [ Failure ]
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations index 73bfbca..214dff7 100644 --- a/third_party/blink/web_tests/LeakExpectations +++ b/third_party/blink/web_tests/LeakExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Slow Skip ]
diff --git a/third_party/blink/web_tests/MSANExpectations b/third_party/blink/web_tests/MSANExpectations index 10f615cf..ac1f7ba 100644 --- a/third_party/blink/web_tests/MSANExpectations +++ b/third_party/blink/web_tests/MSANExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Slow Skip ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 30d07022..d9bfbdd 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Mac11-arm64 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Mac11-arm64 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Skip Pass ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 76477f2..761fba7 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index c6c0084..f9142b3 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1,4 +1,4 @@ -# tags: [ Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Mac11-arm64 Win Win7 Win10.20h2 ] +# tags: [ Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Mac11-arm64 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Skip ] @@ -3336,6 +3336,8 @@ crbug.com/626703 [ Win ] external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Mac ] virtual/prerender/external/wpt/speculation-rules/prerender/media-autoplay.html [ Skip Timeout ] +crbug.com/626703 [ Win ] virtual/prerender/external/wpt/speculation-rules/prerender/media-autoplay.html [ Skip Timeout ] crbug.com/626703 [ Mac10.12 ] external/wpt/html/browsers/browsing-the-web/back-forward-cache/eligibility/broadcast-channel.html [ Timeout ] crbug.com/626703 [ Mac10.12 ] external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission.https.html [ Timeout ] crbug.com/626703 [ Mac10.12 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/sandboxed-features.https.html [ Timeout ] @@ -5738,13 +5740,11 @@ crbug.com/1204176 virtual/compositor-threaded-percent-based-scrolling/fast/events/wheel/wheel-latched-scroll-node-removed.html [ Timeout ] # fast/scrolling -crbug.com/1204176 virtual/main-threaded-percent-based-scrolling/fast/scrolling/hover-during-scroll.html [ Failure ] crbug.com/1204176 virtual/main-threaded-percent-based-scrolling/fast/scrolling/overflow-scrollability.html [ Failure ] crbug.com/1204176 virtual/main-threaded-percent-based-scrolling/fast/scrolling/wheel-and-touch-scroll-use-count.html [ Failure ] crbug.com/1204176 virtual/main-threaded-percent-based-scrolling/fast/scrolling/fractional-scroll-offset-document.html [ Failure ] crbug.com/1204176 virtual/main-threaded-percent-based-scrolling/fast/scrolling/scroll-animation-on-by-default.html [ Failure ] crbug.com/1204176 virtual/main-threaded-percent-based-scrolling/fast/scrolling/wheel-scroll-latching-on-scrollbar.html [ Failure Pass ] -crbug.com/1204176 virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/hover-during-scroll.html [ Failure ] crbug.com/1204176 virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/overflow-scrollability.html [ Failure Timeout ] crbug.com/1204176 virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/wheel-and-touch-scroll-use-count.html [ Failure Timeout ] crbug.com/1204176 virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/fractional-scroll-offset-document.html [ Failure ] @@ -7312,6 +7312,7 @@ # Flaky with setTimeout without clamp crbug.com/1272955 http/tests/devtools/extensions/extensions-timeline-api.js [ Failure Pass ] +crbug.com/1302309 external/wpt/streams/transferable/writable-stream.html [ Failure Pass ] # Flaky as depends upon order of execution. crbug.com/1274917 external/wpt/content-security-policy/inheritance/history.sub.html [ Failure Pass Timeout ]
diff --git a/third_party/blink/web_tests/VIRTUAL_OWNERS b/third_party/blink/web_tests/VIRTUAL_OWNERS index 79fe4fa..30fd1d0 100644 --- a/third_party/blink/web_tests/VIRTUAL_OWNERS +++ b/third_party/blink/web_tests/VIRTUAL_OWNERS
@@ -4,12 +4,15 @@ # CL description: # - If the CL adds virtual tests (by adding new virtual suites or new # directories to existing virtual suties), how many tests the CL adds. -# - If the number of new tests is big (e.g. >=1000), +# - If the number of new tests is big (e.g. >=500) # - Whether the new tests can be skipped on some platforms / OS versions. # - Whether the new directories are essential for test coverage. # - Whether other alternatives [1] are more suitable than virtual suites. -# - How much more time of the swarm jobs for the blink_web_tests step on -# bots will take. +# - The percentage of time the virtual suite will take. The author can +# find this data in "layout_test_results" page ("Timing stats" in the +# top-right corner) linked from "archive results for blink_web_tests" +# step on try bots like linux-rel, mac-rel and win10_chromium_x64_rel_ng. +# Normally the percentage should be less than 5%. # # [1] https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_tests.md#testing-runtime-flags
diff --git a/third_party/blink/web_tests/W3CImportExpectations b/third_party/blink/web_tests/W3CImportExpectations index 246e0cbb..f557318e 100644 --- a/third_party/blink/web_tests/W3CImportExpectations +++ b/third_party/blink/web_tests/W3CImportExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Skip ]
diff --git a/third_party/blink/web_tests/WPTOverrideExpectations b/third_party/blink/web_tests/WPTOverrideExpectations index 79fad3cd..01feb06 100644 --- a/third_party/blink/web_tests/WPTOverrideExpectations +++ b/third_party/blink/web_tests/WPTOverrideExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Slow Skip ]
diff --git a/third_party/blink/web_tests/WebDriverExpectations b/third_party/blink/web_tests/WebDriverExpectations index 47094583..52982352 100644 --- a/third_party/blink/web_tests/WebDriverExpectations +++ b/third_party/blink/web_tests/WebDriverExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac10.14 Mac10.15 Mac11 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Slow Skip ]
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations index 08a794c..b3c9d00 100644 --- a/third_party/blink/web_tests/WebGPUExpectations +++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -1,4 +1,4 @@ -# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac11 Win Win7 Win10.20h2 ] +# tags: [ Android Fuchsia Linux Mac Mac10.12 Mac10.13 Mac11 Win Win7 Win10.20h2 Win11 ] # tags: [ Release Debug ] # results: [ Timeout Crash Pass Failure Slow Skip RetryOnFailure ]
diff --git a/third_party/blink/web_tests/document-transition/multiple-shared-elements-animate-crash.html b/third_party/blink/web_tests/document-transition/multiple-shared-elements-animate-crash.html index b9ff763..afd028e 100644 --- a/third_party/blink/web_tests/document-transition/multiple-shared-elements-animate-crash.html +++ b/third_party/blink/web_tests/document-transition/multiple-shared-elements-animate-crash.html
@@ -46,16 +46,16 @@ async_test((t) => { t.step(() => { requestAnimationFrame(() => requestAnimationFrame(async () => { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1, e2] - }); + document.createDocumentTransition(async (transition) => { + transition.setElement(e1, "e1"); + transition.setElement(e2, "e2"); - container.classList.remove("left"); - container.classList.add("right"); + await transition.captureAndHold(); - await document.documentTransition.start({ - sharedElements: [e1, e2] + container.classList.remove("left"); + container.classList.add("right"); + + await transition.start(); }); requestAnimationFrame(() => {
diff --git a/third_party/blink/web_tests/document-transition/paint-order.html b/third_party/blink/web_tests/document-transition/paint-order.html index 5590d8c..1daff159 100644 --- a/third_party/blink/web_tests/document-transition/paint-order.html +++ b/third_party/blink/web_tests/document-transition/paint-order.html
@@ -9,13 +9,12 @@ background-color: blue; contain: paint; } -html::page-transition-container(shared-0) { isolation: isolate; } -html::page-transition-outgoing-image(shared-0) { +html::page-transition-outgoing-image(shared) { opacity: 1; mix-blend-mode: normal; animation: unset; } -html::page-transition-incoming-image(shared-0) { +html::page-transition-incoming-image(shared) { opacity: 1; mix-blend-mode: multiply; animation: unset; @@ -33,20 +32,19 @@ async function doTransition() { let elem = document.getElementsByTagName("div")[0]; - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [elem] - }); + document.createDocumentTransition(async (t) => { + t.setElement(elem, "shared"); + await t.captureAndHold(); - elem.style.backgroundColor = "red"; - await document.documentTransition.start({ - sharedElements: [elem] - }); + elem.style.backgroundColor = "red"; - if (window.testRunner) { - requestAnimationFrame(() => requestAnimationFrame(() => testRunner.notifyDone())); - } + await t.start(); + + if (window.testRunner) { + requestAnimationFrame(() => requestAnimationFrame(() => testRunner.notifyDone())); + } + }); } -onload = doTransition; +onload = requestAnimationFrame(() => requestAnimationFrame(doTransition)); </script>
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index 9327512..0d522326 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 61c7012c79ee042c7a56caba18de3e13c9c7cadc +Version: b95980870bfbad4969b88bd8c3a8d488608e86f5
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 681c6d5..a46609c 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -1548,6 +1548,13 @@ ] }, "css-overflow": { + "chrome-body-overflow-propagation-crash.html": [ + "22607b4a4d037cdd9185ead784c9480f0926a79a", + [ + null, + {} + ] + ], "outline-with-opacity-crash.html": [ "556e3cfedcd31d696827211d5626f756fb25dd93", [ @@ -306036,7 +306043,7 @@ "early-hints": { "resources": { "early-hints-helpers.js": [ - "19062865b304bb3f28cefa0ec42927da0d9dadeb", + "e2fc1e7d03238e5d1f3566f4209884dc5da30187", [] ], "early-hints-test-loader.h2.py": [ @@ -306052,7 +306059,7 @@ [] ], "preload-initiator-type.html": [ - "81643d448300eeee506aa31d8d3f6ea79e6e2070", + "34188df2fe437fdbc8d6814ad33c83c8dac23391", [] ] } @@ -316839,12 +316846,8 @@ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", [] ], - "eval-channel.html": [ - "e975aca39fd7fec060bbe9443536430192be2c88", - [] - ], - "eval-init.html": [ - "621ab372c74049ffa9a983fd4ca0ec8aadd67425", + "exec.html": [ + "757dba1688b982b44bbfe1eac22cd3f6d0f9937f", [] ], "iframe-added-post-activation.html": [ @@ -316884,7 +316887,7 @@ [] ], "utils.js": [ - "7278024385bf960263a6ad382a937c71882c79ed", + "38aaff7de733211a1a220b521d1c20d4c5339a5f", [] ], "visibility-state-check.html": [ @@ -420265,7 +420268,7 @@ ] ], "download.https.sub.html": [ - "6f2a0434d497f695a44cc0d8972083d7cfa194c9", + "a95d9d65f00580d0090db355eecc92c7c3ab93f1", [ null, { @@ -507921,7 +507924,7 @@ ] ], "cache-storage.https.html": [ - "39d0de399c03d669b7f554d702ee827c034b51a5", + "b2044a40780def8f74a0e3dcd4d108546d033001", [ null, { @@ -507930,7 +507933,7 @@ ] ], "cookies.html": [ - "bdae3c50239a5a462eaabbff0d47e118ab33a919", + "84cbd1c6d13ba24bda0809a622b38e3c6ab2d89d", [ null, { @@ -507948,7 +507951,7 @@ ] ], "fetch-blob.html": [ - "880b05bdb969bc26359eaca1896650e6eb404054", + "7f8d55704934ba8ebd0a8fafab16934c815ad05d", [ null, { @@ -507966,7 +507969,7 @@ ] ], "indexeddb.html": [ - "0ac0d21a3389660bbb11d168a94173b7ce5afa4b", + "40528dce5a2a2c5ec141c0666abbfc49940bf727", [ null, { @@ -507975,7 +507978,7 @@ ] ], "local-storage.html": [ - "dc4008c7ecc435823063fca5cbfa79b18fbdf7d3", + "367d6ca23c2442e9392c9aa24a2a2dcf247d65dd", [ null, { @@ -507993,7 +507996,7 @@ ] ], "restriction-focus.html": [ - "0806b0c1943119b4bc9ce6b1f9bb5aee9f50e9a1", + "10df5b8dd2aedcbdfda5ecffe9d095c509fb7760", [ null, { @@ -508057,7 +508060,7 @@ ] ], "service-workers.https.html": [ - "5187e30513a1997678db9aca7504d1bc55366abb", + "6a45276057d75b8504e00b214d903c98b4173755", [ null, { @@ -508102,7 +508105,7 @@ ] ], "workers.html": [ - "a3f7c323d49e0998b24f31cc05435262f283c552", + "83c281b209ef749518673b91bab031072a41979e", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html index 1c21a18..192f69b 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html
@@ -1,70 +1,42 @@ -<!DOCTYPE html> -<html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<meta http-equiv="Content-Security-Policy" content="child-src 'self' http://www1.{{host}}:{{ports[http][0]}}; script-src 'self' 'unsafe-inline'; connect-src 'self';"> </head> +<body></body> -<head> - <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.--> - <meta http-equiv="Content-Security-Policy" content="child-src 'self' http://www1.{{host}}:{{ports[http][0]}}; script-src 'self' 'unsafe-inline'; connect-src 'self';"> - <title>child-src-cross-origin-load</title> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src='../support/logTest.sub.js?logs=["PASS IFrame %231 generated a load event.","PASS IFrame %232 generated a load event.","PASS IFrame %233 generated a load event.", "violated-directive=frame-src"]'></script> - <script> - window.addEventListener("message", function(event) { - alert_assert(event.data); - }, false); +<script> +async_test(test => { + let count = 0; + window.addEventListener("message", test.step_func((event) => { + assert_equals(event.data, "PASS"); + count++; + assert_less_than_equal(count, 2); + if (count == 2) { + // Use a timeout, to let some time for additional messages to show up + // before declaring this test as completed. + test.step_timeout(() => test.done(), 1000); + } + })); +}, "Two of the three iframe are expected to load."); - window.addEventListener("securitypolicyviolation", function(e) { - log("violated-directive=" + e.violatedDirective); - }); +// IFrames blocked by CSP should generate a 'load', not 'error' event, +// regardless of blocked state. This means they appear to be normal +// cross-origin loads, thereby not leaking URL information directly to JS. +const runTest = (description, src) => { + async_test(test => { + const iframe = document.createElement("iframe"); + iframe.src = src; + iframe.onload = () => test.done(); + iframe.onerror = () => test.assert_unreached('unexpected onerror') + document.body.appendChild(iframe); + }, description); +}; - var t_alert = async_test('Expecting alerts: ["PASS","PASS"]'); - var expected_alerts = ["PASS", "PASS"]; +runTest("Navigation in iframe allowed by child-src 'self'", + "/content-security-policy/support/postmessage-pass.html"); - function alert_assert(msg) { - t_alert.step(function() { - if (msg.match(/^FAIL/i)) { - assert_unreached(msg); - t_alert.done(); - } - for (var i = 0; i < expected_alerts.length; i++) { - if (expected_alerts[i] == msg) { - assert_equals(expected_alerts[i], msg); - expected_alerts.splice(i, 1); - if (expected_alerts.length == 0) { - t_alert.done(); - } - return; - } - } - assert_unreached('unexpected alert: ' + msg); - t_alert.done(); - }); - } +runTest("Navigation in iframe allowed by child-src explicit CSP source", + "http://{{domains[www1]}}:{{ports[http][0]}}/content-security-policy/support/postmessage-pass.html"); - </script> - <!-- enforcing policy: -child-src 'self' http://www1.{{host}}:{{ports[http][0]}}; script-src 'self' 'unsafe-inline'; connect-src 'self'; ---> - <p> - IFrames blocked by CSP should generate a 'load', not 'error' event, regardless of blocked state. This means they appear to be normal cross-origin loads, thereby not leaking URL information directly to JS. - </p> - <script> - window.wasPostTestScriptParsed = true; - var loads = 0; - - function loadEvent() { - loads++; - log("PASS " + "IFrame #" + loads + " generated a load event."); - } - - </script> -</head> - -<body> - <iframe src="/content-security-policy/support/postmessage-pass.html" onload="loadEvent()"></iframe> - <iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/content-security-policy/support/postmessage-pass.html" onload="loadEvent()"></iframe> - <iframe src="http://{{domains[www2]}}:{{ports[http][0]}}/content-security-policy/support/postmessage-fail.html" onload="loadEvent()" onerror="log('FAIL')"></iframe> - <div id="log"></div> -</body> - -</html> +runTest("Navigation in iframe not allowed by child-src", + "http://{{domains[www2]}}:{{ports[http][0]}}/content-security-policy/support/postmessage-fail.html"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-mock.js b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-mock.js index 6ab4cbfa..3d2359a 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-mock.js +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm-mock.js
@@ -1,4 +1,4 @@ -import { RequestMode, RequestIdTokenStatus, LogoutRpsStatus, RevokeStatus, FederatedAuthRequest, FederatedAuthRequestReceiver } from '/gen/third_party/blink/public/mojom/webid/federated_auth_request.mojom.m.js'; +import { RequestIdTokenStatus, LogoutRpsStatus, RevokeStatus, FederatedAuthRequest, FederatedAuthRequestReceiver } from '/gen/third_party/blink/public/mojom/webid/federated_auth_request.mojom.m.js'; function toMojoIdTokenStatus(status) { return RequestIdTokenStatus["k" + status]; @@ -60,8 +60,8 @@ } // Implements - // RequestIdToken(url.mojom.Url provider, string id_request, RequestMode mode) => (RequestIdTokenStatus status, string? id_token); - async requestIdToken(provider, idRequest, mode) { + // RequestIdToken(url.mojom.Url provider, string id_request) => (RequestIdTokenStatus status, string? id_token); + async requestIdToken(provider, idRequest) { if (this.returnPending_) { this.pendingPromise_ = new Promise((resolve, reject) => { this.pendingPromiseResolve_ = resolve;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/crashtests/negative-section-distribution.html b/third_party/blink/web_tests/external/wpt/css/css-tables/crashtests/negative-section-distribution.html new file mode 100644 index 0000000..b0cedcaf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/crashtests/negative-section-distribution.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<div style="display: flex;"> + <button> + <div style="float: left; padding-top: 2147483648em;"></div> + </button> + <table> + <caption style="display: flex;"> + text<br>text + </caption> + <tbody></tbody> + </table> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/section-no-tbody-fixed-distribution.html b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/section-no-tbody-fixed-distribution.html new file mode 100644 index 0000000..dd403d2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/section-no-tbody-fixed-distribution.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/4418"> +<p>Test passes if there is a filled green square.</p> +<div style="display: table; width: 100px; height: 100px;"> + <div style="display: table-header-group; background: green; height: 20px;"> + <div></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/section-no-tbody-percent-distribution.html b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/section-no-tbody-percent-distribution.html new file mode 100644 index 0000000..d1546b1e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/section-no-tbody-percent-distribution.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/4418"> +<p>Test passes if there is a filled green square.</p> +<div style="display: table; width: 100px; height: 100px;"> + <div style="display: table-header-group; background: green; height: 20%;"> + <div></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/download.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/download.https.sub.html index 6f2a0434..a95d9d65 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/download.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/download.https.sub.html
@@ -12,7 +12,7 @@ let nonce = token(); let a = document.createElement('a'); a.download = ''; - a.text = nonce; + a.text = 'Download URL'; let url = `https://${host}/fetch/metadata/resources/record-header.py?file=download` + nonce; a.href = url;
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cache-storage.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cache-storage.https.html index 39d0de3..b2044a40 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cache-storage.https.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cache-storage.https.html
@@ -3,6 +3,7 @@ <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="/common/utils.js"></script> <script src="resources/utils.js"></script> <body>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cookies.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cookies.html index bdae3c5..84cbd1c 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cookies.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/cookies.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <script src="/cookie-store/resources/cookie-test-helpers.js"></script> <body>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/fetch-blob.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/fetch-blob.html index 880b05bd..7f8d557 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/fetch-blob.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/fetch-blob.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html index 0ac0d21a..40528dce 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/indexeddb.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <script src="resources/indexedb-utils.js"></script> <body>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/local-storage.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/local-storage.html index dc4008c..367d6ca 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/local-storage.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/local-storage.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <body> <script>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/eval-channel.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/eval-channel.html deleted file mode 100644 index e975aca..0000000 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/eval-channel.html +++ /dev/null
@@ -1,34 +0,0 @@ -<!DOCTYPE html> -<head> - <script src="/common/utils.js"></script> - <script src="utils.js"></script> - <script> - const params = new URLSearchParams(window.location.search); - const uuid = params.get('uuid'); - const logChannel = new PrerenderChannel(uuid, 'log'); - window.prerender_log = (...args) => logChannel.postMessage(args); - new PrerenderChannel(uuid, 'exec').addEventListener('message', - async ({detail: {fn, args, receiver}}) => { - const receiverChannel = new PrerenderChannel(uuid, receiver); - try { - const result = await (eval(`(${fn})`)(args)) || null; - receiverChannel.postMessage({result}); - } catch (error) { - receiverChannel.postMessage({error}); - } - }); - - window.import_script_to_prerendered_page = src => { - const script = document.createElement('script'); - script.src = src; - document.head.appendChild(script); - return new Promise(resolve => script.addEventListener('load', resolve)); - } - - window.addEventListener('error', error => - logChannel.postMessage(['[Prerendered Page Error]', {message: error.message, stack: error.stack}])); - - window.prerender_log('Channel Created'); - new PrerenderChannel(uuid, 'ready').postMessage({}); - </script> -</head> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/eval-init.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/eval-init.html deleted file mode 100644 index 621ab37..0000000 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/eval-init.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <script src="utils.js"></script> -</head> -<body> - <a id="open" href="#">Activate Prerendered Page</a> - <script> - const params = new URLSearchParams(window.location.search); - const uuid = params.get('uuid'); - const url = `eval-channel.html${location.search}`; - new PrerenderChannel(uuid, 'initiator').addEventListener('message', - ({detail}) => { - if (detail === 'close') - window.close(); - else if (detail === 'activate') - location.href = url; - }); - const rules = document.createElement('script'); - document.querySelector('a#open').href = url; - rules.type = "speculationrules"; - rules.text = JSON.stringify({prerender: [{source: 'list', urls: [url]}]}); - document.head.appendChild(rules); - </script> -</body> -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/exec.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/exec.html new file mode 100644 index 0000000..757dba1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/exec.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<head> + <script src="/common/utils.js"></script> + <script src="/common/dispatcher/dispatcher.js"></script> + <script> + new Executor(new URLSearchParams(window.location.search).get('uuid')); + </script> +</head> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/utils.js b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/utils.js index 72780243..38aaff7d 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/utils.js +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/utils.js
@@ -144,76 +144,55 @@ }); } -class PrerenderChannel extends EventTarget { - broadcastChannel = null; - - constructor(uid, name) { - super(); - this.broadcastChannel = new BroadcastChannel(`${uid}-${name}`); - this.broadcastChannel.addEventListener('message', e => { - this.dispatchEvent(new CustomEvent('message', {detail: e.data})); - }); - } - - postMessage(message) { - this.broadcastChannel.postMessage(message); - } - - close() { - this.broadcastChannel.close(); - } -}; - async function create_prerendered_page(t) { - const uuid = token(); - new PrerenderChannel(uuid, 'log').addEventListener('message', message => { - // Calling it with ['log'] to avoid lint issue. This log should be used for debugging - // the prerendered context, not testing. - if(window.console) - console['log']('[From Prerendered]', ...message.detail); + const init_uuid = token(); + const prerender_uuid = token(); + const init_remote = new RemoteContext(init_uuid); + const prerender_remote = new RemoteContext(prerender_uuid); + window.open(`/speculation-rules/prerender/resources/exec.html?uuid=${init_uuid}&init`, '_blank', 'noopener'); + const url = `/speculation-rules/prerender/resources/exec.html?uuid=${prerender_uuid}&prerender`; + + await init_remote.execute_script(url => { + const a = document.createElement('a'); + a.href = url; + a.innerText = 'Activate'; + document.body.appendChild(a); + const rules = document.createElement('script'); + rules.type = "speculationrules"; + rules.text = JSON.stringify({prerender: [{source: 'list', urls: [url]}]}); + document.head.appendChild(rules); + }, [url]); + + await prerender_remote.execute_script(() => { + window.import_script_to_prerendered_page = src => { + const script = document.createElement('script'); + script.src = src; + document.head.appendChild(script); + return new Promise(resolve => script.addEventListener('load', resolve)); + } }); - const execChannel = new PrerenderChannel(uuid, 'exec'); - const initChannel = new PrerenderChannel(uuid, 'initiator'); - const exec = (func, args = []) => { - const receiver = token(); - execChannel.postMessage({receiver, fn: func.toString(), args}); - return new Promise((resolve, reject) => { - const channel = new PrerenderChannel(uuid, receiver); - channel.addEventListener('message', ({detail}) => { - channel.close(); - if (detail.error) - reject(detail.error) - else - resolve(detail.result); - }); - }) - }; - - window.open(`/speculation-rules/prerender/resources/eval-init.html?uuid=${uuid}`, '_blank', 'noopener'); - t.add_cleanup(() => initChannel.postMessage('close')); - t.add_cleanup(() => exec(() => window.close())); - await new Promise(resolve => { - const channel = new PrerenderChannel(uuid, 'ready'); - channel.addEventListener('message', () => { - channel.close(); - resolve(); - }); + t.add_cleanup(() => { + init_remote.execute_script(() => window.close()); + prerender_remote.execute_script(() => window.close()); }); async function activate() { - const prerendering = exec(() => new Promise(resolve => + const prerendering = prerender_remote.execute_script(() => new Promise(resolve => document.addEventListener('prerenderingchange', () => { resolve(document.prerendering); }))); - initChannel.postMessage('activate'); + init_remote.execute_script(url => { + location.href = url; + }, [url]); + if (await prerendering) throw new Error('Should not be prerendering at this point') } return { - exec, + exec: (fn, args) => prerender_remote.execute_script(fn, args), activate }; }
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-focus.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-focus.html index 0806b0c..10df5b8 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-focus.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-focus.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <body> <input type="text" id = "prerenderTextField">
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/service-workers.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/service-workers.https.html index 5187e305..6a45276 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/service-workers.https.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/service-workers.https.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> <body>
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html index a3f7c323..83c281b2 100644 --- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/workers.html
@@ -4,6 +4,7 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> <script src="resources/utils.js"></script> <body> <script>
diff --git a/third_party/blink/web_tests/fast/harness/results.html b/third_party/blink/web_tests/fast/harness/results.html index 6305cd19..a6b192b 100644 --- a/third_party/blink/web_tests/fast/harness/results.html +++ b/third_party/blink/web_tests/fast/harness/results.html
@@ -195,12 +195,12 @@ color: green; } -#timing-stats-table { +.timing-stats-table { text-align: right; white-space: nowrap; } -#timing-stats-table th { +.timing-stats-table th { padding-left: 10px; } @@ -239,7 +239,9 @@ <div id="timing-stats" class="popup hidden hide-on-esc"> <button style="position:fixed;right:40px;" onclick="GUI.toggleVisibility('timing-stats')">Close</button> <h3>Timing stats</h3> - <table id="timing-stats-table"></table> + <table id="timing-stats-table" class="timing-stats-table"></table> + <h3>Virtual suites</h3> + <table id="timing-stats-virtuals" class="timing-stats-table"></table> </div> <div id="help" class="popup hidden hide-on-esc"> @@ -1705,8 +1707,11 @@ let table = document.querySelector("#timing-stats-table"); if (!table.firstChild) { let counts = []; + let virtual_counts = {}; let times = []; + let virtual_times = {}; let timeout_counts = []; + let virtual_timeout_counts = {}; let total_count = 0; let total_count_timeouts = 0; let max = 0; @@ -1722,13 +1727,22 @@ total_time_all += time; // result.time is measured during the first run, so check the first // TIMEOUT here. - if (test.actual.startsWith('TIMEOUT')) { + let is_timeout = test.actual.startsWith('TIMEOUT'); + if (is_timeout) { timeout_counts[int_time] = (timeout_counts[int_time] || 0) + 1; total_time_timeouts += time; total_count_timeouts++; } total_count++; max = Math.max(max, int_time + 1); + + if (path.startsWith('/virtual/')) { + let suite = path.split('/', 3)[2]; + virtual_counts[suite] = (virtual_counts[suite] || 0) + 1; + virtual_times[suite] = (virtual_times[suite] || 0) + time; + virtual_timeout_counts[suite] = + (virtual_timeout_counts[suite] || 0) + (is_timeout ? 1 : 0); + } } ); let i = 0; @@ -1774,6 +1788,40 @@ <td>${Math.round(total_time_timeouts)}s</td> </tr>`; table.innerHTML = html; + + // Generate timing stats for virtual suites. + html = `<tr> + <th>Suite</th> + <th colspan="2">Count/Percent<img class="stat-bar-count"></th> + <th>Timeouts</th> + <th colspan="2">Time/Percent<img class="stat-bar-time"></th> + <th style="width: 40%"></th> + </tr>`; + let virtual_array = []; + for (let suite in virtual_counts) { + virtual_array.push({ + suite: suite, + count: virtual_counts[suite], + time: virtual_times[suite], + timeout_count: virtual_timeout_counts[suite], + }); + } + virtual_array.sort((a, b) => { return b.time - a.time; }); + for (let v of virtual_array) { + let count_percent = (v.count / total_count * 100).toFixed(2); + let time_percent = (v.time / total_time_all * 100).toFixed(2); + html += `<tr> + <td>${v.suite}</td> + <td>${v.count}</td><td>${count_percent}%</td> + <td>${v.timeout_count}</td> + <td>${Math.round(v.time)}s</td><td>${time_percent}%</td> + <td> + <div class="stat-bar-count" style="width: ${count_percent * 3}%"></div> + <div class="stat-bar-time" style="width: ${time_percent * 3}%"></div> + </td> + </tr>`; + } + document.querySelector('#timing-stats-virtuals').innerHTML = html; } GUI.toggleVisibility('timing-stats'); },
diff --git a/third_party/blink/web_tests/fast/scrolling/hover-during-scroll.html b/third_party/blink/web_tests/fast/scrolling/hover-during-scroll.html deleted file mode 100644 index 9a555143..0000000 --- a/third_party/blink/web_tests/fast/scrolling/hover-during-scroll.html +++ /dev/null
@@ -1,112 +0,0 @@ -<!DOCTYPE html> -<script src='../../resources/testharness.js'></script> -<script src='../../resources/testharnessreport.js'></script> -<script src='../../resources/gesture-util.js'></script> - -<style> - body, html { - margin: 0; - } - div { - line-height: 50px; - } - - .hoverme { - background-color: lightblue; - } -</style> - -<table id="table_to_fill" width="100%" cellpadding="0px" cellspacing="0px" border="0px"> -</table> - -<script> - - let array; - const numHoverElements = 30; - const elementHeight = 50; - const textWhenNotHovered = "hover over me"; - const textWhenHovered = "currently hovered"; - const textWhenWasHovered = "was hovered"; - const mouse = GestureSourceType.MOUSE_INPUT; - - function centerOfDivAtIndex(n) { - return elementHeight * n + elementHeight / 2; - } - - - function buildPage() { - let table = document.getElementById('table_to_fill'); - for (let i = 0; i < numHoverElements; i++) { - let p = document.createElement('tr'); - p.innerHTML = '<tr><td><div class="hoverme">' + textWhenNotHovered + '</div></td></tr>'; - table.appendChild(p); - } - - array = document.getElementsByClassName('hoverme'); - - for (let i = 0; i < array.length; i++) { - array[i].addEventListener('mouseover', function (e) { - this.innerHTML = textWhenHovered; - this.style.backgroundColor = "yellow"; - }); - array[i].addEventListener('mouseout', function (e) { - this.innerHTML = textWhenWasHovered; - this.style.backgroundColor = "green"; - }); - } - } - - window.onload = async () => { - if (window.internals) - internals.settings.setScrollAnimatorEnabled(false); - - buildPage(); - await waitForCompositorCommit(); - - promise_test(async () => { - let x = 50; - let y = centerOfDivAtIndex(0); - // Move cursor to 1st element. - await mouseMoveTo(x, y); - await waitFor( () => { return array[0].innerHTML == textWhenHovered;}, 'wait for move to 1st element'); - assert_equals(array[0].innerHTML, textWhenHovered); - assert_equals(array[1].innerHTML, textWhenNotHovered); - - // Move cursor to 2nd element. - y = centerOfDivAtIndex(1); - await mouseMoveTo(x, y); - await waitFor( () => { return array[1].innerHTML == textWhenHovered;}, 'wait for move to 2nd element'); - assert_equals(array[0].innerHTML, textWhenWasHovered); - assert_equals(array[1].innerHTML, textWhenHovered); - assert_equals(array[2].innerHTML, textWhenNotHovered); - - // Scroll end up at 4th element. Hover state does not update during scrolling - // so that 3rd element keeps not hover state. - assert_equals(document.scrollingElement.scrollTop, 0); - await smoothScroll(2 * elementHeight, x, y, mouse, 'down', SPEED_INSTANT); - await waitFor( () => { return array[3].innerHTML == textWhenHovered;}, 'wait for scroll stop at 4th element'); - assert_equals(array[0].innerHTML, textWhenWasHovered); - assert_equals(array[1].innerHTML, textWhenWasHovered); - assert_equals(array[2].innerHTML, textWhenNotHovered); - assert_equals(array[3].innerHTML, textWhenHovered); - assert_equals(array[4].innerHTML, textWhenNotHovered); - assert_approx_equals(document.scrollingElement.scrollTop, 2 * elementHeight, 2); - - // Hide cursor and scroll end up at 5th element. No hover state should update. - internals.setIsCursorVisible(document, false); - await smoothScroll(elementHeight, x, y, mouse, 'down', SPEED_INSTANT, true /* precise_scrolling_deltas */, false /* scroll_by_page */, false /* cursor_visible */); - await waitFor( () => { - return document.scrollingElement.scrollTop >= 3 * elementHeight - 10 && document.scrollingElement.scrollTop <= 3 * elementHeight + 10;}, 'wait for scroll stop at 5th element'); - // Wait enough time to see if we fire a fake mouse move event to update the hover state. - await waitForAnimationEnd(() => { return document.scrollingElement.scrollTop; }, 200, 60); - assert_equals(array[0].innerHTML, textWhenWasHovered); - assert_equals(array[1].innerHTML, textWhenWasHovered); - assert_equals(array[2].innerHTML, textWhenNotHovered); - assert_equals(array[3].innerHTML, textWhenHovered); - assert_equals(array[4].innerHTML, textWhenNotHovered); - assert_equals(array[5].innerHTML, textWhenNotHovered); - - }, 'crbug.com/153784 New hover effects should not be invoked during scroll if the mouse cursor is not visible.'); - } - -</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/scrolling/no-hover-during-scroll-hidden-cursor.html b/third_party/blink/web_tests/fast/scrolling/no-hover-during-scroll-hidden-cursor.html new file mode 100644 index 0000000..0b0f241 --- /dev/null +++ b/third_party/blink/web_tests/fast/scrolling/no-hover-during-scroll-hidden-cursor.html
@@ -0,0 +1,61 @@ +<!DOCTYPE html> +<script src='../../resources/testharness.js'></script> +<script src='../../resources/testharnessreport.js'></script> +<script src='../../resources/gesture-util.js'></script> +<script src="resources/hover-on-scroll-checker.js"></script> + +<style> + body, html { + margin: 0; + height: 500vh; + } + div { + height: 50px; + width: 100%; + } + + .hoverme { + background-color: rgb(0, 0, 255); + } + + .hoverme:hover { + background-color: rgb(255, 255, 0); + } + + .message { + width: 100%; + text-align: left; + } +</style> + +<div class="hoverme">hover over me</div> +<div class="hoverme">hover over me</div> +<div class="hoverme">hover over me</div> +<div class="hoverme">hover over me</div> +<div class="hoverme">hover over me</div> + +<script> + window.onload = async () => { + if (window.internals) + internals.settings.setScrollAnimatorEnabled(false); + + promise_test(async () => { + const elementHeight = 50; + const mouse = GestureSourceType.MOUSE_INPUT; + const scrollSpeed = 350; + const preciseScrollingDeltas = true; + const scrollByPage = false; + const cursorIsVisible = false; + const postScrollHoverIndex = 0; + const scrollCallback = (x, y) => { + internals.setIsCursorVisible(document, false); + return smoothScroll(3 * elementHeight, x, y, mouse, 'down', + scrollSpeed, preciseScrollingDeltas, + scrollByPage, cursorIsVisible); + }; + return runHoverStateOnScrollTest(scrollCallback, postScrollHoverIndex); + }, 'crbug.com/153784 New hover effects should not be invoked during ' + + 'scroll if the mouse cursor is not visible.'); + } + +</script>
diff --git a/third_party/blink/web_tests/scrollbars/custom-scrollbar-disabled-recalc-crash.html b/third_party/blink/web_tests/scrollbars/custom-scrollbar-disabled-recalc-crash.html new file mode 100644 index 0000000..2e6e61d --- /dev/null +++ b/third_party/blink/web_tests/scrollbars/custom-scrollbar-disabled-recalc-crash.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<title>Ensure toggling display of custom scrollbars via :disabled pseudo does not hang.</title> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<style> +* ::-webkit-scrollbar { + height: 8px; width: 8px +} + +* ::-webkit-scrollbar:disabled { + display: none +} + +.scroller { + overflow: auto; + max-width:200px; + position:relative; + height: 8px; +} + +.abs { + position: absolute; + bottom: -4px; right: -10px; + width: 40px; height: 10%; +} +</style> +<div class="scroller"> + <div class="abs"></div> +</div> +<script> +test(function() { + document.body.offsetLeft + }, 'Should not crash/hang'); +</script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html index 9a578cb..893b1856 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
@@ -34,15 +34,14 @@ <div id=e1 class=box></div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1] + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + await t.captureAndHold(); + e1.classList.add("dst"); + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); }); - e1.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [e1] - }); - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); } onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html index 6cd4cb8..e854acb 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
@@ -45,15 +45,17 @@ <div id=e3 class=box>three</div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1, e2, e3] - }); - e1.classList.add("dst"); - e2.classList.add("dst"); - e3.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [e1, e2, e3] + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + t.setElement(e2, "e2"); + t.setElement(e3, "e3"); + await t.captureAndHold(); + + e1.classList.add("dst"); + e2.classList.add("dst"); + e3.classList.add("dst"); + + t.start(); }); requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); }
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html index 72f348a0..f1a79e9 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html
@@ -33,17 +33,20 @@ <div id=e3 class=box></div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1, e2, e3] + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + t.setElement(e2, "e2"); + t.setElement(e3, "e3"); + await t.captureAndHold(); + + e1.classList.add("dst"); + e2.classList.add("dst"); + e3.classList.add("dst"); + + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); }); - e1.classList.add("dst"); - e2.classList.add("dst"); - e3.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [e1, e2, e3] - }); - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); } onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-root-ref.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-root-ref.html new file mode 100644 index 0000000..d649fc5f --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-root-ref.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<title>Shared transitions: capture opacity elements (ref)</title> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<style> +.box { + background: lightgreen; + width: 100px; + height: 100px; + contain: paint; + position: absolute; + will-change: transform; +} +#e1 { + top: 10px; + left: 30px; +} +</style> +<div id=e1 class=box></div> +
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-root.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-root.html new file mode 100644 index 0000000..8f1ae23 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-root.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<title>Shared transitions: capture root elements</title> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<link rel="match" href="new-content-captures-root-ref.html"> +<script src="/common/reftest-wait.js"></script> +<style> +.box { + background: lightblue; + width: 100px; + height: 100px; + contain: paint; + position: absolute; + will-change: transform; +} +#e1 { + top: 10px; + left: 30px; +} +#shared { + contain: paint; + width: 100px; + height: 100px; + background: red; +} + +div.dst { background: lightgreen; } +/* We're verifying what we capture, so just display the old contents for 5 minutes. */ +html::page-transition { background: pink; } +html::page-transition-container(shared) { animation-duration: 300s; } +html::page-transition-image-wrapper(shared) { visibility: hidden } +html::page-transition-outgoing-image(root) { animation-duration: 0s; opacity: 0 } +html::page-transition-incoming-image(root) { animation-duration: 0s; opacity: 1 } +</style> +<div id=e1 class=box></div> +<div id=shared></div> +<script> +async function runTest() { + document.createDocumentTransition(async (t) => { + t.setElement(shared, "shared"); + + await t.captureAndHold(); + + e1.classList.add("dst"); + + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); + }); +} +onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); +</script> +
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html index 30e7af5..9958196 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html
@@ -33,15 +33,16 @@ <div id=e1 class=box></div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1] + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + await t.captureAndHold(); + + e1.classList.add("dst"); + + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); }); - e1.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [e1] - }); - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); } onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html index 2c8677a..2e5c66b4d 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
@@ -45,17 +45,20 @@ <div id=e3 class=box>three</div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1, e2, e3] + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + t.setElement(e2, "e2"); + t.setElement(e3, "e3"); + await t.captureAndHold(); + + e1.classList.add("dst"); + e2.classList.add("dst"); + e3.classList.add("dst"); + + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); }); - e1.classList.add("dst"); - e2.classList.add("dst"); - e3.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [e1, e2, e3] - }); - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); } onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html index 5f020953..db57c1b 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
@@ -34,17 +34,20 @@ <div id=e3 class=box>three</div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1, e2, e3] + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + t.setElement(e2, "e2"); + t.setElement(e3, "e3"); + await t.captureAndHold(); + + e1.classList.add("dst"); + e2.classList.add("dst"); + e3.classList.add("dst"); + + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); }); - e1.classList.add("dst"); - e2.classList.add("dst"); - e3.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [e1, e2, e3] - }); - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); } onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html index dac3abab..ce187204 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html
@@ -24,11 +24,12 @@ height: 100px; background: red; } + div.dst { background: lightgreen; } /* We're verifying what we capture, so just display the old contents for 5 minutes. */ html::page-transition { background: pink; } -html::page-transition-container(shared-0) { animation-duration: 300s; } -html::page-transition-image-wrapper(shared-0) { visibility: hidden } +html::page-transition-container(shared) { animation-duration: 300s; } +html::page-transition-image-wrapper(shared) { visibility: hidden } html::page-transition-outgoing-image(root) { animation: unset; opacity: 1 } html::page-transition-incoming-image(root) { animation: unset; opacity: 0 } </style> @@ -36,17 +37,17 @@ <div id=shared></div> <script> async function runTest() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [shared] - }); - e1.classList.add("dst"); - document.documentTransition.start({ - sharedElements: [shared] - }); + document.createDocumentTransition(async (t) => { + t.setElement(shared, "shared"); - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); + await t.captureAndHold(); + + e1.classList.add("dst"); + + t.start(); + + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); + }); } onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); </script> -
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-author-style.manual.html b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-author-style.manual.html index 00b8128c..38e8c7c 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-author-style.manual.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-author-style.manual.html
@@ -57,16 +57,16 @@ background-color: grey; } - html::page-transition-container(shared-0) { + html::page-transition-container(target) { left: 50px; } - html::page-transition-outgoing-image(shared-0) { + html::page-transition-outgoing-image(target) { opacity: 0.5; animation-name: none; } - html::page-transition-incoming-image(shared-0) { + html::page-transition-incoming-image(target) { opacity: 0.5; } ` @@ -75,20 +75,20 @@ pseudoStyle.appendChild(document.createTextNode(transitionStyle)); async function runAnimation() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [target] - }); + document.createDocumentTransition(async (t) => { + t.setElement(target, "target"); + await t.captureAndHold(); - target.classList.remove(classes[i]); - i = (i + 1) % classes.length; - target.classList.add(classes[i]); + target.classList.remove(classes[i]); + i = (i + 1) % classes.length; + target.classList.add(classes[i]); - document.head.appendChild(pseudoStyle); - await document.documentTransition.start({ - sharedElements: [target] + document.head.appendChild(pseudoStyle); + + await t.start(); + + document.head.removeChild(pseudoStyle); }); - document.head.removeChild(pseudoStyle); } function init() {
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half-with-config.manual.html b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half-with-config.manual.html deleted file mode 100644 index 0514f2b..0000000 --- a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half-with-config.manual.html +++ /dev/null
@@ -1,69 +0,0 @@ -<!DOCTYPE html> -<html> -<title>Shared transitions of different elements and shapes</title> -<link rel="help" href="https://github.com/vmpstr/shared-element-transitions"> -<link rel="author" href="mailto:vmpstr@chromium.org"> - -<style> -body { - background: lightpink; - overflow: hidden; -} - -input { - position: absolute; - left: 8px; - top: 8px; - z-index: 10; -} - -.top { - top: 0px; -} -.bottom { - bottom: 0px; -} - -div { - position: absolute; - left: 0px; - right: 0px; - height: 40vh; - background: green; - contain: paint; -} -</style> - -<input id=toggle type=button value="Toggle!"></input> -<div id=target class=top> -The green div should alternate being at the bottom and at the top. -Other than green and pink background no other colors should appear. -</div> - -<script> -let classes = ["top", "bottom"] -let backgroundColors = ["lightpink", "lightblue"] -let i = 0; -async function runAnimation() { - await document.documentTransition.prepare({ - rootTransition: "explode", - rootConfig: {duration:"500", delay: "500"}, - sharedElements: [target], - sharedElementsConfig: [{duration:"1000", delay:"1000"}] - }); - - document.body.style.background = backgroundColors[i]; - target.classList.remove(classes[i]); - i = (i + 1) % classes.length; - target.classList.add(classes[i]); - - await document.documentTransition.start({ - sharedElements: [target] - }); -} - -function init() { - toggle.addEventListener("click", runAnimation); -} -onload = init; -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half.manual.html b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half.manual.html index 4c041b6c..90ee5b8 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half.manual.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-half.manual.html
@@ -44,17 +44,15 @@ let classes = ["top", "bottom"] let i = 0; async function runAnimation() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [target] - }); + document.createDocumentTransition(async (t) => { + t.setElement(target, "target"); + await t.captureAndHold(); - target.classList.remove(classes[i]); - i = (i + 1) % classes.length; - target.classList.add(classes[i]); + target.classList.remove(classes[i]); + i = (i + 1) % classes.length; + target.classList.add(classes[i]); - await document.documentTransition.start({ - sharedElements: [target] + await t.start(); }); }
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-repeated-elements.manual.html b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-repeated-elements.manual.html deleted file mode 100644 index d6251e2a..0000000 --- a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-repeated-elements.manual.html +++ /dev/null
@@ -1,79 +0,0 @@ -<!DOCTYPE html> -<html> -<title>Shared transitions: repeated elements (one -> two elements and back)</title> -<link rel="help" href="https://github.com/vmpstr/shared-element-transitions"> -<link rel="author" href="mailto:vmpstr@chromium.org"> - -<style> -body { - background: lightpink; -} - -#container { - width: max-content; - position: relative; -} - -.hidden { display: none; } - -.shape { - width: 100px; - height: 100px; - border-radius: 50%; - border: 1px solid black; - position: absolute; - contain: paint; -} - -#yellow { - background: yellow; - left: 300px; - top: 50px; -} -#green { - background: green; - left: 50px; - top: 150px; -} -#blue { - background: blue; - left: 300px; - top: 250px; -} -</style> - -<input id=toggle type=button value="Toggle!"></input> -<span>One shape becomes two and vice versa</span> -<div id=green class=shape></div> -<div id=blue class="shape hidden"></div> -<div id=yellow class="shape hidden"></div> - -<script> -function visibleSharedElements() { - if (green.classList.contains("hidden")) { - return [blue, yellow]; - } else { - return [green, green]; - } -} - -async function runAnimation() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: visibleSharedElements() - }); - - green.classList.toggle("hidden"); - blue.classList.toggle("hidden"); - yellow.classList.toggle("hidden"); - - await document.documentTransition.start({ - sharedElements: visibleSharedElements() - }); -} - -function init() { - toggle.addEventListener("click", runAnimation); -} -onload = init; -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-shapes.manual.html b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-shapes.manual.html index 7de5adbf..8a06dbad 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-shapes.manual.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/shared-transition-shapes.manual.html
@@ -60,17 +60,19 @@ let classes = ["left", "right"] let i = 0; async function runAnimation() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1, e2, e3, e4, e5] - }); + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + t.setElement(e2, "e2"); + t.setElement(e3, "e3"); + t.setElement(e4, "e4"); + t.setElement(e5, "e5"); + await t.captureAndHold(); - container.classList.remove(classes[i]); - i = (i + 1) % classes.length; - container.classList.add(classes[i]); + container.classList.remove(classes[i]); + i = (i + 1) % classes.length; + container.classList.add(classes[i]); - await document.documentTransition.start({ - sharedElements: [e1, e2, e3, e4, e5] + await t.start(); }); }
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/transition-waits-for-animations.html b/third_party/blink/web_tests/wpt_internal/document-transition/transition-waits-for-animations.html index a7c75ab3..204e891 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/transition-waits-for-animations.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/transition-waits-for-animations.html
@@ -34,16 +34,14 @@ <script> async function startTransition() { - await document.documentTransition.prepare({ - rootTransition: "none", - sharedElements: [e1] - }); + document.createDocumentTransition(async (t) => { + t.setElement(e1, "e1"); + await t.captureAndHold(); - e1.classList.remove("left"); - e1.classList.add("right"); + e1.classList.remove("left"); + e1.classList.add("right"); - document.documentTransition.start({ - sharedElements: [e1] + t.start(); }); }
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/uncontained-transition-crash.html b/third_party/blink/web_tests/wpt_internal/document-transition/uncontained-transition-crash.html index 038c5c9..1f6c8836 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/uncontained-transition-crash.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/uncontained-transition-crash.html
@@ -31,13 +31,22 @@ async function runTest() { await waitForAtLeastOneFrame(); // Prepare with a shared element - let promise = document.documentTransition.prepare({ sharedElements: [first] }); - // Force a hit test, which will determine compositing reasons. - document.elementFromPoint(0, 0); - // Now wait for the prepare to happen. This will note that we don't have - // paint containment and should de-composite the element. - await promise; - document.documentTransition.start({ sharedElements: [second] }); + document.createDocumentTransition(async (t) => { + t.setElement(first, "shared"); + let promise = t.captureAndHold(); + + // Force a hit test, which will determine compositing reasons. + document.elementFromPoint(0, 0); + + // Now wait for the capture to happen. This will note that we don't have + // paint containment and should de-composite the element. + await promise; + + t.setElement(first, null); + t.setElement(second, "shared"); + + t.start(); + }); takeScreenshot(); }
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/consume-user-activation.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/consume-user-activation.https.html index d78d08e..e4ad20d 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/consume-user-activation.https.html +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/consume-user-activation.https.html
@@ -88,11 +88,7 @@ // Check that B's transient user activation was consumed. assert_activations(true, true, "A"); - // TODO(crbug.com/1291210): B should be inactive after consuming the - // transient user activation, but due to a preexisting bug it isn't. - // Replace with this once fixed: - // await B.execute(assert_activations, [true, false, "B"]); - await B.execute(assert_activations, [true, true, "B"]); + await B.execute(assert_activations, [true, false, "B"]); }, 'user-activation'); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js index 3b267d1..e829d814 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
@@ -1,23 +1,6 @@ const STORE_URL = '/wpt_internal/fenced_frame/resources/key-value-store.py'; const REMOTE_EXECUTOR_URL = '/wpt_internal/fenced_frame/resources/remote-context-executor.https.html'; -// This is a dictionary of stash keys to access a specific piece of the -// server-side stash. In order to communicate between browsing contexts that -// cannot otherwise talk, the two browsing contexts (the producer and consumer) -// must use the same key, which is impossible to obtain as you normally would -// via the common API's token() method (which returns a UUID). Therefore in this -// file, for each piece of data we're interested in communicating between the -// fenced frame's embedder and the fenced frame itself, we have to fix a key so -// that both frames can reference it. We need a separate stash key for each -// test that passes data, since multiple tests can run in parallel and would -// otherwise interfere with each other's server state. -const KEYS = { - "embed_coep_require_corp" : "00000000-0000-0000-0000-000000000031", - "embed_no_coep" : "00000000-0000-0000-0000-000000000032", - // Don't use the KEYS system; use token() instead. For details, see - // third_party/blink/web_tests/wpt_internal/fenced_frame/README.md. -} - // Creates a URL that includes a list of stash key UUIDs that are being used // in the test. This allows us to generate UUIDs on the fly and let anything // (iframes, fenced frames, pop-ups, etc...) that wouldn't have access to the
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/restrict-size.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/restrict-size.https.html new file mode 100644 index 0000000..5668407d --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/restrict-size.https.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>Test fencedframe size restrictions in opaque ads mode.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.js"></script> + +<body> +<script> +promise_test(async () => { + const frame = attachFencedFrameContext(); +}, 'restrict fencedframe size'); +</script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html index d81fc78b..7c6738c 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
@@ -15,7 +15,7 @@ promise_test(async t => { try { await sharedStorage.runURLSelectionOperation( - "test-url-selection-operation", ["1", "2", "3", "4", "5", "6"]); + "test-url-selection-operation", ["1", "2", "3", "4", "5", "6", "7", "8", "9"]); } catch (e) { assert_equals(e.name, 'DataError'); assert_equals(e.message, 'Length of the \"urls\" parameter is not valid.');
diff --git a/third_party/r8/playground/.gitignore b/third_party/r8/playground/.gitignore index 3a055fb..1e14b5e 100644 --- a/third_party/r8/playground/.gitignore +++ b/third_party/r8/playground/.gitignore
@@ -2,4 +2,5 @@ *.dex *.jar *.txt +*.mapping desugar_jdk_libs.pgcfg
diff --git a/third_party/r8/playground/build.sh b/third_party/r8/playground/build.sh index 67f0ed9..092f007 100755 --- a/third_party/r8/playground/build.sh +++ b/third_party/r8/playground/build.sh
@@ -39,6 +39,7 @@ --desugared-lib-pg-conf-output desugar_jdk_libs.pgcfg \ --no-minification \ --pg-conf playground.pgcfg \ + --pg-map-output Playground.mapping \ --output . \ *.class $DEXDUMP -d classes.dex > dexdump.txt @@ -56,5 +57,5 @@ unzip -p desugar_jdk_libs.dex.jar classes.dex > desugar_jdk_libs.dex fi du -b *.dex -echo 'dexdump.txt updated.' +echo 'Outputs are: Playground.mapping, classes.dex, dexdump.txt'
diff --git a/third_party/robolectric/BUILD.gn b/third_party/robolectric/BUILD.gn index cc1c991..1d5f625 100644 --- a/third_party/robolectric/BUILD.gn +++ b/third_party/robolectric/BUILD.gn
@@ -7,15 +7,15 @@ group("robolectric_runtime_jars") { testonly = true data = [ - "//third_party/robolectric/lib/android-all-instrumented-4.4_r1-robolectric-r2-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-5.0.2_r3-robolectric-r0-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-6.0.1_r3-robolectric-r1-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-7.1.0_r7-robolectric-r1-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-8.0.0_r4-robolectric-r1-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-8.1.0-robolectric-4611349-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-9-robolectric-4913185-2-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-10-robolectric-5803371-i1.jar", - "//third_party/robolectric/lib/android-all-instrumented-11-robolectric-6757853-i1.jar", + "//third_party/robolectric/lib/android-all-instrumented-4.4_r1-robolectric-r2-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-5.0.2_r3-robolectric-r0-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-6.0.1_r3-robolectric-r1-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-7.1.0_r7-robolectric-r1-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-8.0.0_r4-robolectric-r1-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-8.1.0-robolectric-4611349-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-9-robolectric-4913185-2-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-10-robolectric-5803371-i3.jar", + "//third_party/robolectric/lib/android-all-instrumented-11-robolectric-6757853-i3.jar", ] }
diff --git a/third_party/wayland-protocols/README.chromium b/third_party/wayland-protocols/README.chromium index 7876f90..95b22036 100644 --- a/third_party/wayland-protocols/README.chromium +++ b/third_party/wayland-protocols/README.chromium
@@ -1,15 +1,3 @@ -This component wraps several external sources of Wayland protocol extensions. -Descriptions of each source go below. - -To upgrade a source to a new version: -- Find the commit hash of that version in the project's git repository specified - in the source's section below. -- Update the DEPS entry to the commit found above with this command: - $ roll-dep --roll-to=<commit> <source-checkout-path> -- Run gclient sync to update the local working copy with the new version. -- Update this README to reflect the new version number in the source's section. - --------------------------------------------------------------------------------- Name: wayland-protocols URL: http://wayland.freedesktop.org/ Version: 1.21 @@ -27,6 +15,18 @@ Source checkout path: src/third_party/wayland-protocols/src +Additional note: +This component wraps several external sources of Wayland protocol extensions. +Descriptions of each source go below. + +To upgrade a source to a new version: +- Find the commit hash of that version in the project's git repository specified + in the source's section below. +- Update the DEPS entry to the commit found above with this command: + $ roll-dep --roll-to=<commit> <source-checkout-path> +- Run gclient sync to update the local working copy with the new version. +- Update this README to reflect the new version number in the source's section. + -------------------------------------------------------------------------------- Name: gtk URL: https://github.com/GNOME/gtk
diff --git a/tools/attribution_reporting/simulator_main.cc b/tools/attribution_reporting/simulator_main.cc index 4de6dea1..b136648 100644 --- a/tools/attribution_reporting/simulator_main.cc +++ b/tools/attribution_reporting/simulator_main.cc
@@ -246,7 +246,7 @@ "report_time": 123, // URL to which the report would have been sent. - "report_url": "https://reporting.example/.well-known/attribution-reporting/report-attribution", + "report_url": "https://reporting.example/.well-known/attribution-reporting/report-event-attribution", // The report itself. See // https://github.com/WICG/conversion-measurement-api/blob/main/EVENT.md#attribution-reports
diff --git a/tools/fuchsia/manifest_usage.py b/tools/fuchsia/manifest_usage.py new file mode 100755 index 0000000..4de09a67 --- /dev/null +++ b/tools/fuchsia/manifest_usage.py
@@ -0,0 +1,161 @@ +#!/usr/bin/env python3 +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +""" +Prints out du-style information about the files that will be deployed +for a given target +""" + +import argparse +import os +import re +import sys +from typing import Iterable +from enum import Enum + + +def format_size(bytesize: float) -> str: + """Convert bytes to human readable format. + + Args: + bytesize: Number to humanize + + Returns: + Size as string in human-readable format (e.g. 1.8MiB) + """ + if bytesize < 1024: + return f'{bytesize}B' + + for suffix in 'BKMGTPEZY': + if bytesize < 1024: + break + bytesize /= 1024 + + return f'{bytesize:.1f}{suffix}iB' # pylint: disable=undefined-loop-variable + + +class FilesystemNode: + def __init__(self, path: str) -> None: + self.path = path + self.descendant_count = 0 + try: + self.size = 0 if os.path.isdir(self.path) else os.path.getsize(self.path) + except FileNotFoundError: + print(f'{path} not found, please check that you have compiled ' + 'the target that generates this manifest.') + exit(1) + + +class Analysis(Enum): + FILE_COUNT = 'file_count' + SIZE = 'size' + + def __str__(self): + return self.value + + +class SortOrder(Enum): + ASCENDING = 'ascending' + DESCENDING = 'descending' + + def __str__(self): + return self.value + + +def compute_prefix_paths(path: str) -> Iterable[str]: + prefix = path.rpartition('/')[0] + while prefix: + yield prefix + prefix = prefix.rpartition('/')[0] + + +class ManifestAnalyzer: + def __init__(self) -> None: + self.path_map: dict[str, FilesystemNode] = dict() + + def parse_manifest(self, manifest_path: str) -> None: + out_dir = re.match('out\/[^\/]+', manifest_path).group() + + with open(manifest_path, 'r') as manifest: + for line in manifest: + relative_path = line.strip().partition('=')[2] + self.register_file(f'{out_dir}/{relative_path}') + + def register_file(self, path: str) -> None: + if path in self.path_map: + return + + leaf_node = FilesystemNode(path) + self.path_map[path] = leaf_node + + for prefix in compute_prefix_paths(path): + if prefix in self.path_map: + parent_node = self.path_map[prefix] + else: + parent_node = FilesystemNode(prefix) + self.path_map[prefix] = parent_node + + parent_node.descendant_count += 1 + parent_node.size += leaf_node.size + + def print_file_count(self, max_depth: int, sort_order: SortOrder) -> None: + sorted_nodes = sorted(self.path_map.values(), + key=lambda node: node.descendant_count, + reverse=sort_order == SortOrder.DESCENDING) + for node in sorted_nodes: + if node.descendant_count <= 0: + continue + depth = node.path.count('/') + if depth > max_depth: + continue + print(f'{node.descendant_count: >10}\t{node.path}') + + def print_byte_size(self, max_depth: int, sort_order: SortOrder) -> None: + sorted_nodes = sorted(self.path_map.values(), + key=lambda node: node.size, + reverse=sort_order == SortOrder.DESCENDING) + for node in sorted_nodes: + depth = node.path.count('/') + if depth > max_depth: + continue + print(f'{format_size(node.size): >10}\t{node.path}') + + +def main(): + parser = argparse.ArgumentParser( + description='Launches a long-running emulator that can ' + 'be re-used for multiple test runs.') + parser.add_argument( + 'manifest_path', + type=str, + help='path to the .manifest ' + 'file. For example, the manifest for chrome/test:browser_tests can be ' + 'found at <out_dir>/gen/chrome/test/browser_tests/browser_tests.manifest') + parser.add_argument('--analysis', + type=Analysis, + choices=list(Analysis), + default=Analysis.SIZE, + help='which type of analysis to print') + parser.add_argument('--max-depth', + type=int, + default=sys.maxsize, + help='only print directories to the provided depth') + parser.add_argument( + '--sort-order', + type=SortOrder, + choices=list(SortOrder), + default=SortOrder.ASCENDING, + help='which order to use for sorting, defualts to ascending') + args = parser.parse_args() + + analyzer = ManifestAnalyzer() + analyzer.parse_manifest(args.manifest_path) + if args.analysis == Analysis.FILE_COUNT: + analyzer.print_file_count(args.max_depth, args.sort_order) + else: + analyzer.print_byte_size(args.max_depth, args.sort_order) + + +if __name__ == '__main__': + main()
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 0be53f3..913e1d6 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -378,6 +378,8 @@ 'mac-paeverywhere-x64-fyi-dbg': 'debug_bot_paeverywhere_x64', 'mac-paeverywhere-x64-fyi-rel': 'release_trybot_paeverywhere_x64', 'mac-upload-perfetto': 'release_bot_perfetto_zlib', + 'Win ASan Release Media (reclient shadow)': 'asan_fuzzer_v8_heap_chrome_with_codecs_release_bot_reclient', + 'Win ASan Release (reclient shadow)': 'asan_fuzzer_v8_heap_release_bot_reclient', 'win-annotator-rel': 'release_bot', 'win-celab-builder-rel': 'release_bot_minimal_symbols', 'win-backuprefptr-x86-fyi-rel': 'release_trybot_backuprefptr_x86', @@ -1774,10 +1776,18 @@ 'clang', 'asan', 'fuzzer', 'v8_heap', 'chrome_with_codecs', 'release_bot', ], + 'asan_fuzzer_v8_heap_chrome_with_codecs_release_bot_reclient': [ + 'clang', 'asan', 'fuzzer', 'v8_heap', 'chrome_with_codecs', 'release_bot_reclient', + ], + 'asan_fuzzer_v8_heap_release_bot': [ 'clang', 'asan', 'fuzzer', 'v8_heap', 'release_bot', ], + 'asan_fuzzer_v8_heap_release_bot_reclient': [ + 'clang', 'asan', 'fuzzer', 'v8_heap', 'release_bot_reclient', + ], + 'asan_lsan_chromeos_release_bot_dcheck_always_on': [ 'asan', 'lsan', 'chromeos', 'release_trybot_minimal_symbols', ],
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json index c0a74d46..4dd2dc7 100644 --- a/tools/mb/mb_config_expectations/chromium.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -352,6 +352,34 @@ "use_goma": true } }, + "Win ASan Release (reclient shadow)": { + "gn_args": { + "dcheck_always_on": false, + "enable_ipc_fuzzer": true, + "is_asan": true, + "is_clang": true, + "is_component_build": false, + "is_debug": false, + "use_rbe": true, + "use_remoteexec": true, + "v8_enable_verify_heap": true + } + }, + "Win ASan Release Media (reclient shadow)": { + "gn_args": { + "dcheck_always_on": false, + "enable_ipc_fuzzer": true, + "ffmpeg_branding": "Chrome", + "is_asan": true, + "is_clang": true, + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "use_rbe": true, + "use_remoteexec": true, + "v8_enable_verify_heap": true + } + }, "Win x64 Builder (reclient compare)": { "gn_args": { "dcheck_always_on": false,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 51d0225..371aa67 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -31790,6 +31790,7 @@ <int value="1631" label="AUTOTESTPRIVATE_ADDLOGINEVENTFORTESTING"/> <int value="1632" label="OS_DIAGNOSTICS_RUNDISKREADROUTINE"/> <int value="1633" label="FILEMANAGERPRIVATE_MOUNTGUEST"/> + <int value="1634" label="AUTOTESTPRIVATE_ISLACROSPRIMARYBROWSER"/> </enum> <enum name="ExtensionIconState">
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml index 347f029..968e859 100644 --- a/tools/metrics/histograms/metadata/ash/histograms.xml +++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1808,7 +1808,7 @@ </histogram> <histogram name="Ash.HotseatTransition.Drag.PresentationTime" units="ms" - expires_after="2022-04-10"> + expires_after="2023-03-01"> <owner>anasalazar@chromium.org</owner> <owner>newcomer@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml index 7f86255..12ea1d6a 100644 --- a/tools/metrics/histograms/metadata/service/histograms.xml +++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -1013,6 +1013,17 @@ </summary> </histogram> +<histogram name="ServiceWorker.Storage.RetryQueueSizeForRecovery" units="tasks" + expires_after="2022-10-04"> + <owner>joenotcharles@google.com</owner> + <owner>chrome-worker@google.com</owner> + <summary> + The number of queued tasks that are waiting to be re-posted after recovering + from a Storage Service crash. Logged at the same time as + ServiceWorker.Storage.RetryCountForRecovery. + </summary> +</histogram> + <histogram name="ServiceWorker.{operation}Time" units="ms" expires_after="2022-08-24"> <owner>cduvall@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 57bcd20f9..9d22b122 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -498,7 +498,6 @@ ]) _FUCHSIA_ATLAS_PERF_FYI_BENCHMARK_CONFIGS = PerfSuite([ _GetBenchmarkConfig('system_health.common_desktop'), - _GetBenchmarkConfig('system_health.memory_desktop') ]) _LINUX_PERF_CALIBRATION_BENCHMARK_CONFIGS = PerfSuite([ _GetBenchmarkConfig('speedometer2'), @@ -664,8 +663,7 @@ _FUCHSIA_ATLAS_PERF_FYI_BENCHMARK_CONFIGS, 1, 'fuchsia', - is_fyi=True, - executables=FUCHSIA_EXEC_CONFIGS['atlas']) + is_fyi=True) # Calibration bots LINUX_PERF_CALIBRATION = PerfPlatform(
diff --git a/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json b/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json index ab7f69e..130d400 100644 --- a/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json +++ b/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json
@@ -3,29 +3,15 @@ "benchmarks": { "system_health.common_desktop": { "abridged": false - }, - "system_health.memory_desktop": { - "abridged": false - } - }, - "executables": { - "base_perftests": { - "path": "bin/run_base_perftests", - "arguments": [ - "--test-launcher-jobs=1", - "--test-launcher-retry-limit=0", - "-d", - "--os-check=ignore" - ] } } }, "extra_infos": { - "num_stories": 165, - "predicted_min_shard_time": 2540.0, + "num_stories": 82, + "predicted_min_shard_time": 879.0, "predicted_min_shard_index": 0, - "predicted_max_shard_time": 2540.0, + "predicted_max_shard_time": 879.0, "predicted_max_shard_index": 0, - "shard #0": 2540.0 + "shard #0": 879.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json b/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json index 4ecf637..c3c17d8 100644 --- a/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json +++ b/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json
@@ -1,6 +1,62 @@ [ { - "duration": "900.0", - "name": "base_perftests/_gtest_" + "duration": "3.0", + "name": "system_health.common_desktop/browse:media:youtube:2019" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:earth:2020" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:gmail-compose:2020" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:gmail-labelclick:2020" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:gmail-search:2020" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:photoshop:2021" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:photoshop_warm:2021" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse:tools:sheets:2019" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/browse_accessibility:media:youtube" + }, + { + "duration": "23.0", + "name": "system_health.common_desktop/load:media:9gag" + }, + { + "duration": "19.0", + "name": "system_health.common_desktop/load:news:flipboard" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/load:tools:chat:2020" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/load:tools:gmail:2019" + }, + { + "duration": "131.0", + "name": "system_health.common_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "3.0", + "name": "system_health.common_desktop/multitab:misc:typical24" } ] \ No newline at end of file
diff --git a/ui/android/junit/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapterTest.java b/ui/android/junit/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapterTest.java index 39dfaae84..c5840ac 100644 --- a/ui/android/junit/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapterTest.java +++ b/ui/android/junit/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapterTest.java
@@ -7,14 +7,15 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import android.app.Activity; import android.view.View; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -45,9 +46,6 @@ // Mockito Spies allow us to intercept calls to parent class. private SimpleRecyclerViewAdapter mSpyAdapter; - @Mock - View mMockView; - @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -62,9 +60,10 @@ .useConstructor(mModelList) .defaultAnswer(Mockito.CALLS_REAL_METHODS)); - mSpyAdapter.registerType(VIEW_TYPE_1, parent -> mMockView, (m, v, p) -> {}); - mSpyAdapter.registerType(VIEW_TYPE_2, parent -> mMockView, (m, v, p) -> {}); - mSpyAdapter.registerType(VIEW_TYPE_3, parent -> mMockView, (m, v, p) -> {}); + View view = new View(Robolectric.setupActivity(Activity.class)); + mSpyAdapter.registerType(VIEW_TYPE_1, parent -> view, (m, v, p) -> {}); + mSpyAdapter.registerType(VIEW_TYPE_2, parent -> view, (m, v, p) -> {}); + mSpyAdapter.registerType(VIEW_TYPE_3, parent -> view, (m, v, p) -> {}); } @Test
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc index 3986e23..e7554bd8 100644 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc +++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
@@ -30,14 +30,6 @@ #include "ui/events/keycodes/keyboard_code_conversion.h" #include "ui/events/keycodes/keyboard_code_conversion_xkb.h" -// xkb_keymap_key_get_mods_for_level is relatively new (introduced in ver 1.0, -// Sep 6, 2020), thus it is not available on some platform, such as Ubuntu -// 18.04, which we still supports. -// Thus declare the function as weak here, so we can check the availability on -// runtime. -extern "C" __attribute__((weak)) decltype( - xkb_keymap_key_get_mods_for_level) xkb_keymap_key_get_mods_for_level; - namespace ui { namespace { @@ -900,17 +892,7 @@ } // Reconstruct keysym map. - std::vector<std::pair<XkbKeysymMapKey, uint32_t>> keysym_map; - auto AddEntries = [&keysym_map](base::span<const xkb_keysym_t> keysyms, - base::span<const xkb_mod_mask_t> masks, - xkb_keycode_t keycode) { - if (keysyms.empty() || masks.empty()) - return; - for (xkb_keysym_t keysym : keysyms) { - for (xkb_mod_mask_t mask : masks) - keysym_map.emplace_back(XkbKeysymMapKey(keysym, mask), keycode); - } - }; + std::vector<XkbKeysymMapEntry> keysym_map; const xkb_keycode_t min_key = xkb_keymap_min_keycode(keymap); const xkb_keycode_t max_key = xkb_keymap_max_keycode(keymap); @@ -924,34 +906,33 @@ const xkb_keysym_t* keysyms; int num_syms = xkb_keymap_key_get_syms_by_level(keymap, keycode, layout, level, &keysyms); - if (xkb_keymap_key_get_mods_for_level) { - xkb_mod_mask_t masks[100]; // Large enough buffer. - int num_mods = xkb_keymap_key_get_mods_for_level( - keymap, keycode, layout, level, masks, std::size(masks)); - AddEntries(base::make_span(keysyms, num_syms), - base::make_span(masks, num_mods), keycode); - } else { - // If not, unfortunately, there's no convenient/efficient way - // to take the possible masks. Thus, use mask 0 always. - constexpr xkb_mod_mask_t kMask[] = {0}; - AddEntries(base::make_span(keysyms, num_syms), kMask, keycode); - } + for (int i = 0; i < num_syms; ++i) + keysym_map.emplace_back( + XkbKeysymMapEntry{keysyms[i], keycode, layout}); } } } - // Sort here. If there are multiple entries for a (keysym, mask) pair, - // min keycode wins. - std::sort(keysym_map.begin(), keysym_map.end()); + // Then sort and unique here. On tie break, smaller keycode comes first. + std::sort( + keysym_map.begin(), keysym_map.end(), + [](const XkbKeysymMapEntry& entry1, const XkbKeysymMapEntry& entry2) { + return std::tie(entry1.xkb_keysym, entry1.xkb_keycode, + entry1.xkb_layout) < std::tie(entry2.xkb_keysym, + entry2.xkb_keycode, + entry2.xkb_layout); + }); keysym_map.erase( - std::unique(keysym_map.begin(), keysym_map.end(), - [](const std::pair<XkbKeysymMapKey, uint32_t>& entry1, - const std::pair<XkbKeysymMapKey, uint32_t>& entry2) { - return entry1.first == entry2.first; - }), + std::unique( + keysym_map.begin(), keysym_map.end(), + [](const XkbKeysymMapEntry& entry1, const XkbKeysymMapEntry& entry2) { + return std::tie(entry1.xkb_keysym, entry1.xkb_keycode, + entry1.xkb_layout) == std::tie(entry2.xkb_keysym, + entry2.xkb_keycode, + entry2.xkb_layout); + }), keysym_map.end()); - xkb_keysym_map_ = base::flat_map<XkbKeysymMapKey, uint32_t>( - base::sorted_unique, std::move(keysym_map)); + xkb_keysym_map_ = std::move(keysym_map); layout_index_ = 0; #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -999,18 +980,38 @@ DomCode XkbKeyboardLayoutEngine::GetDomCodeByKeysym(uint32_t keysym, uint32_t modifiers) const { - // If xkb_keymap_key_get_mods_for_level is not available, all entries are - // stored with modifiers mask is 0. - if (!xkb_keymap_key_get_mods_for_level) - modifiers = 0; - - auto iter = xkb_keysym_map_.find(XkbKeysymMapKey(keysym, modifiers)); - if (iter == xkb_keysym_map_.end()) { - VLOG(1) << "No Keycode found for the keysym: " << keysym - << ", modifiers: " << modifiers; - return DomCode::NONE; + // Look up all candidates. + auto range = std::equal_range( + xkb_keysym_map_.begin(), xkb_keysym_map_.end(), XkbKeysymMapEntry{keysym}, + [](const XkbKeysymMapEntry& entry1, const XkbKeysymMapEntry& entry2) { + return entry1.xkb_keysym < entry2.xkb_keysym; + }); + if (range.first != range.second) { + // Note: value is already in the lexicographical order, so smaller keycode + // comes first. + for (std::unique_ptr<xkb_state, XkbStateDeleter> xkb_state( + xkb_state_new(xkb_state_get_keymap(xkb_state_.get()))); + range.first != range.second; ++range.first) { + xkb_keycode_t xkb_keycode = range.first->xkb_keycode; + xkb_layout_index_t xkb_layout = range.first->xkb_layout; + // The argument does not have any info about the layout, so we assume the + // current layout here. + if (xkb_layout != layout_index_) + continue; + xkb_state_update_mask(xkb_state.get(), modifiers, 0, 0, 0, 0, xkb_layout); + const xkb_keysym_t* out_keysyms; + int num_syms = + xkb_state_key_get_syms(xkb_state.get(), xkb_keycode, &out_keysyms); + for (int i = 0; i < num_syms; ++i) { + if (out_keysyms[i] == keysym) + return KeycodeConverter::NativeKeycodeToDomCode(xkb_keycode); + } + } } - return KeycodeConverter::NativeKeycodeToDomCode(iter->second); + + VLOG(1) << "No Keycode found for the keysym: " << keysym + << ", modifiers: " << modifiers; + return DomCode::NONE; } bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode,
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h index 4fcbce5..3ed6a03 100644 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h +++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
@@ -74,14 +74,19 @@ }; std::vector<XkbFlagMapEntry> xkb_flag_map_; - // Table from (xkb_keysym, xkb_modifier) to xkb_keycode for the current - // keymap. Note that there could be multiple keycodes mapped to the same - // keysym. In the case, the first one (smallest keycode) will be - // kept. - // The first element is keysym value. The second element is a bit-mask of - // modifiers. - using XkbKeysymMapKey = std::pair<uint32_t, uint32_t>; - base::flat_map<XkbKeysymMapKey, uint32_t> xkb_keysym_map_; + // The data to reverse look up xkb_keycode/xkb_layout from xkb_keysym. + // The data is sorted in the (xkb_keysym, xkb_keycode, xkb_layout) dictionary + // order. Note that there can be multiple keycode/layout for a keysym, so + // this is a multi map. + // We can binary search on this vector by keysym as the key, and iterate from + // the begin to the end of the range linearly. Then, on tie break, smaller + // keycode wins. + struct XkbKeysymMapEntry { + xkb_keysym_t xkb_keysym; + xkb_keycode_t xkb_keycode; + xkb_layout_index_t xkb_layout; + }; + std::vector<XkbKeysymMapEntry> xkb_keysym_map_; #if BUILDFLAG(IS_CHROMEOS_ASH) // Flag mask for num lock, which is always considered enabled in ChromeOS.
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc index d885c627..883e14a 100644 --- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc +++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
@@ -17,9 +17,6 @@ #include "ui/events/keycodes/keyboard_code_conversion.h" #include "ui/events/ozone/layout/scoped_keyboard_layout_engine.h" -extern "C" __attribute__((weak)) decltype( - xkb_keymap_key_get_mods_for_level) xkb_keymap_key_get_mods_for_level; - namespace ui { namespace { @@ -945,35 +942,31 @@ constexpr struct { uint32_t keysym; uint32_t modifiers; - DomCode dom_code; + DomCode expected_dom_code; } kTestCases[] = { - {65307, 0, ui::DomCode::ESCAPE}, {65288, 0, ui::DomCode::BACKSPACE}, - {65293, 0, ui::DomCode::ENTER}, {65289, 0, ui::DomCode::TAB}, + {65307, 0, ui::DomCode::ESCAPE}, + {65288, 0, ui::DomCode::BACKSPACE}, + {65293, 0, ui::DomCode::ENTER}, + {65289, 0, ui::DomCode::TAB}, {65056, kShiftMask, ui::DomCode::TAB}, + + // Test conflict keysym case. We use '<' as a testing example. + // On pc101 layout, intl_backslash is expected without SHIFT modifier. + {60, 0, ui::DomCode::INTL_BACKSLASH}, + // And, if SHIFT is pressed, comma key is expected. + {60, kShiftMask, ui::DomCode::COMMA}, + + // Test for space key. The keysym mapping has only one keycode entry. + // It expects all modifiers are ignored. Used SHIFT as testing example. + {32, 0, ui::DomCode::SPACE}, + {32, kShiftMask, ui::DomCode::SPACE}, }; for (const auto& test_case : kTestCases) { - SCOPED_TRACE(test_case.keysym); - EXPECT_EQ(test_case.dom_code, layout_engine_->GetDomCodeByKeysym( - test_case.keysym, test_case.modifiers)); - } - - // Test conflict keysym case. We use '<' as a testing sample. - constexpr uint32_t kLessThanCode = 60; - if (xkb_keymap_key_get_mods_for_level) { - // If there's no modifier, on pc101 us layout, intl_backslash is expected. - EXPECT_EQ(ui::DomCode::INTL_BACKSLASH, - layout_engine_->GetDomCodeByKeysym(kLessThanCode, 0)); - // If there's shift modifier, comma key is expected. - EXPECT_EQ(ui::DomCode::COMMA, - layout_engine_->GetDomCodeByKeysym(kLessThanCode, kShiftMask)); - } else { - // If xkb_keymap_key_get_mods_for_level is unavailable, fallback to older - // implementation, which ignores modifiers. - EXPECT_EQ(ui::DomCode::COMMA, - layout_engine_->GetDomCodeByKeysym(kLessThanCode, 0)); - EXPECT_EQ(ui::DomCode::COMMA, - layout_engine_->GetDomCodeByKeysym(kLessThanCode, kShiftMask)); + EXPECT_EQ(test_case.expected_dom_code, + layout_engine_->GetDomCodeByKeysym(test_case.keysym, + test_case.modifiers)) + << "input: " << test_case.keysym << ", " << test_case.modifiers; } }
diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc index 6c372f96..5882791a 100644 --- a/ui/gtk/gtk_ui.cc +++ b/ui/gtk/gtk_ui.cc
@@ -1054,9 +1054,13 @@ // If we can't get a contrasting stroke from the theme, have ThemeService // provide a stroke color for us. if (toolbar_top_separator_has_good_contrast()) { - color_map[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR] = + color_map[ThemeProperties::COLOR_TAB_STROKE_FRAME_ACTIVE] = toolbar_top_separator; - color_map[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE] = + color_map[ThemeProperties::COLOR_TAB_STROKE_FRAME_INACTIVE] = + toolbar_top_separator_inactive; + color_map[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_ACTIVE] = + toolbar_top_separator; + color_map[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_FRAME_INACTIVE] = toolbar_top_separator_inactive; } }
diff --git a/ui/ozone/platform/drm/common/drm_util.cc b/ui/ozone/platform/drm/common/drm_util.cc index 421be536..55916ebe 100644 --- a/ui/ozone/platform/drm/common/drm_util.cc +++ b/ui/ozone/platform/drm/common/drm_util.cc
@@ -245,6 +245,14 @@ int index = GetDrmProperty(fd, connector, "panel orientation", &property); if (index < 0) return display::PanelOrientation::kNormal; + + // If the DRM driver doesn't provide panel orientation then this property + // will be DRM_MODE_PANEL_ORIENTATION_UNKNOWN (which is -1, except + // `prop_values` is unsigned, so compare against max uint64_t). Assume that + // panels with unknown orientation have normal orientation. + if (connector->prop_values[index] == std::numeric_limits<uint64_t>::max()) + return display::PanelOrientation::kNormal; + DCHECK_LE(connector->prop_values[index], display::PanelOrientation::kLast); return static_cast<display::PanelOrientation>(connector->prop_values[index]); }
diff --git a/ui/ozone/platform/headless/BUILD.gn b/ui/ozone/platform/headless/BUILD.gn index 1620994..20a2ef3 100644 --- a/ui/ozone/platform/headless/BUILD.gn +++ b/ui/ozone/platform/headless/BUILD.gn
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//gpu/vulkan/features.gni") + visibility = [ "//ui/ozone/*" ] source_set("headless") { @@ -24,6 +26,9 @@ deps = [ "//base", + "//build:chromecast_buildflags", + "//build:chromeos_buildflags", + "//gpu/vulkan:buildflags", "//skia", "//ui/base", "//ui/base/cursor", @@ -41,4 +46,14 @@ if (is_fuchsia) { deps += [ "//ui/base/ime/fuchsia" ] } + + if (enable_vulkan && is_linux) { + sources += [ + "vulkan_implementation_headless.cc", + "vulkan_implementation_headless.h", + "vulkan_surface_headless.cc", + "vulkan_surface_headless.h", + ] + deps += [ "//gpu/vulkan" ] + } }
diff --git a/ui/ozone/platform/headless/headless_surface_factory.cc b/ui/ozone/platform/headless/headless_surface_factory.cc index ea78f3ee..b250e05a 100644 --- a/ui/ozone/platform/headless/headless_surface_factory.cc +++ b/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -35,6 +35,10 @@ #include "ui/ozone/platform/headless/headless_window_manager.h" #include "ui/ozone/public/surface_ozone_canvas.h" +#if BUILDFLAG(ENABLE_VULKAN) && BUILDFLAG(IS_LINUX) +#include "ui/ozone/platform/headless/vulkan_implementation_headless.h" +#endif + namespace ui { namespace { @@ -278,4 +282,13 @@ PLOG(FATAL) << "Unable to write to output location"; } +#if BUILDFLAG(ENABLE_VULKAN) && BUILDFLAG(IS_LINUX) +std::unique_ptr<gpu::VulkanImplementation> +HeadlessSurfaceFactory::CreateVulkanImplementation( + bool use_swiftshader, + bool allow_protected_memory) { + return std::make_unique<VulkanImplementationHeadless>(use_swiftshader); +} +#endif + } // namespace ui
diff --git a/ui/ozone/platform/headless/headless_surface_factory.h b/ui/ozone/platform/headless/headless_surface_factory.h index bbd129fb..bf58e12 100644 --- a/ui/ozone/platform/headless/headless_surface_factory.h +++ b/ui/ozone/platform/headless/headless_surface_factory.h
@@ -26,6 +26,11 @@ // SurfaceFactoryOzone: std::vector<gl::GLImplementationParts> GetAllowedGLImplementations() override; GLOzone* GetGLOzone(const gl::GLImplementationParts& implementation) override; +#if BUILDFLAG(ENABLE_VULKAN) && BUILDFLAG(IS_LINUX) + std::unique_ptr<gpu::VulkanImplementation> CreateVulkanImplementation( + bool use_swiftshader, + bool allow_protected_memory) override; +#endif std::unique_ptr<SurfaceOzoneCanvas> CreateCanvasForWidget( gfx::AcceleratedWidget widget) override; scoped_refptr<gfx::NativePixmap> CreateNativePixmap(
diff --git a/ui/ozone/platform/headless/ozone_platform_headless.cc b/ui/ozone/platform/headless/ozone_platform_headless.cc index 9f489c7..011827af 100644 --- a/ui/ozone/platform/headless/ozone_platform_headless.cc +++ b/ui/ozone/platform/headless/ozone_platform_headless.cc
@@ -8,7 +8,10 @@ #include "base/command_line.h" #include "base/files/file_path.h" +#include "base/no_destructor.h" #include "build/build_config.h" +#include "build/chromecast_buildflags.h" +#include "build/chromeos_buildflags.h" #include "ui/base/cursor/cursor_factory.h" #include "ui/base/ime/input_method_minimal.h" #include "ui/display/types/native_display_delegate.h" @@ -98,6 +101,20 @@ return std::make_unique<InputMethodMinimal>(delegate); } +// Desktop Linux, not ChromeOS. +#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_ASH) && \ + !BUILDFLAG(IS_CHROMEOS_LACROS) && !BUILDFLAG(IS_CHROMECAST) + const PlatformProperties& GetPlatformProperties() override { + static base::NoDestructor<OzonePlatform::PlatformProperties> properties; + static bool initialized = false; + if (!initialized) { + properties->uses_external_vulkan_image_factory = true; + initialized = true; + } + return *properties; + } +#endif + bool InitializeUI(const InitParams& params) override { window_manager_ = std::make_unique<HeadlessWindowManager>(); surface_factory_ = std::make_unique<HeadlessSurfaceFactory>(file_path_);
diff --git a/ui/ozone/platform/headless/vulkan_implementation_headless.cc b/ui/ozone/platform/headless/vulkan_implementation_headless.cc new file mode 100644 index 0000000..e9c7feb --- /dev/null +++ b/ui/ozone/platform/headless/vulkan_implementation_headless.cc
@@ -0,0 +1,157 @@ +// Copyright (c) 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/ozone/platform/headless/vulkan_implementation_headless.h" + +#include "base/base_paths.h" +#include "base/callback_helpers.h" +#include "base/files/file_path.h" +#include "base/notreached.h" +#include "base/path_service.h" +#include "base/scoped_environment_variable_override.h" +#include "gpu/vulkan/vulkan_function_pointers.h" +#include "gpu/vulkan/vulkan_image.h" +#include "gpu/vulkan/vulkan_instance.h" +#include "gpu/vulkan/vulkan_surface.h" +#include "gpu/vulkan/vulkan_util.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/gfx/gpu_fence.h" +#include "ui/gfx/gpu_memory_buffer.h" +#include "ui/ozone/platform/headless/vulkan_surface_headless.h" + +namespace ui { + +VulkanImplementationHeadless::VulkanImplementationHeadless(bool use_swiftshader) + : gpu::VulkanImplementation(use_swiftshader) {} + +bool VulkanImplementationHeadless::InitializeVulkanInstance( + bool using_surface) { + using_surface_ = using_surface; + + std::vector<const char*> required_extensions = { + VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, + VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME}; + if (using_surface_) { + required_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); + required_extensions.push_back(VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME); + } + + base::FilePath path; + if (use_swiftshader()) { + if (!base::PathService::Get(base::DIR_MODULE, &path)) + return false; + path = path.Append("libvk_swiftshader.so"); + } else { + path = base::FilePath("libvulkan.so.1"); + } + + return vulkan_instance_.Initialize(path, required_extensions, {}); +} + +gpu::VulkanInstance* VulkanImplementationHeadless::GetVulkanInstance() { + return &vulkan_instance_; +} + +std::unique_ptr<gpu::VulkanSurface> +VulkanImplementationHeadless::CreateViewSurface(gfx::AcceleratedWidget window) { + if (!using_surface_) + return nullptr; + return VulkanSurfaceHeadless::Create(vulkan_instance_.vk_instance(), window); +} + +bool VulkanImplementationHeadless::GetPhysicalDevicePresentationSupport( + VkPhysicalDevice device, + const std::vector<VkQueueFamilyProperties>& queue_family_properties, + uint32_t queue_family_index) { + // TODO(samans): Don't early out once Swiftshader supports this method. + // https://crbug.com/swiftshader/129 + if (use_swiftshader()) + return true; + // Should this be false? + return true; +} + +std::vector<const char*> +VulkanImplementationHeadless::GetRequiredDeviceExtensions() { + std::vector<const char*> extensions; + if (using_surface_) + extensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + return extensions; +} + +std::vector<const char*> +VulkanImplementationHeadless::GetOptionalDeviceExtensions() { + return { + VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, + VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, + VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, + VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, + VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, + VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME, + }; +} + +VkFence VulkanImplementationHeadless::CreateVkFenceForGpuFence( + VkDevice vk_device) { + NOTREACHED(); + return VK_NULL_HANDLE; +} + +std::unique_ptr<gfx::GpuFence> +VulkanImplementationHeadless::ExportVkFenceToGpuFence(VkDevice vk_device, + VkFence vk_fence) { + NOTREACHED(); + return nullptr; +} + +VkSemaphore VulkanImplementationHeadless::CreateExternalSemaphore( + VkDevice vk_device) { + return gpu::CreateExternalVkSemaphore( + vk_device, VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT); +} + +VkSemaphore VulkanImplementationHeadless::ImportSemaphoreHandle( + VkDevice vk_device, + gpu::SemaphoreHandle sync_handle) { + return ImportVkSemaphoreHandle(vk_device, std::move(sync_handle)); +} + +gpu::SemaphoreHandle VulkanImplementationHeadless::GetSemaphoreHandle( + VkDevice vk_device, + VkSemaphore vk_semaphore) { + return gpu::GetVkSemaphoreHandle( + vk_device, vk_semaphore, VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT); +} + +VkExternalMemoryHandleTypeFlagBits +VulkanImplementationHeadless::GetExternalImageHandleType() { + return VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; +} + +bool VulkanImplementationHeadless::CanImportGpuMemoryBuffer( + gfx::GpuMemoryBufferType memory_buffer_type) { + if (memory_buffer_type == gfx::GpuMemoryBufferType::NATIVE_PIXMAP) + return true; + return false; +} + +std::unique_ptr<gpu::VulkanImage> +VulkanImplementationHeadless::CreateImageFromGpuMemoryHandle( + gpu::VulkanDeviceQueue* device_queue, + gfx::GpuMemoryBufferHandle gmb_handle, + gfx::Size size, + VkFormat vk_format) { + constexpr auto kUsage = + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + auto tiling = gmb_handle.native_pixmap_handle.modifier == + gfx::NativePixmapHandle::kNoModifier + ? VK_IMAGE_TILING_OPTIMAL + : VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + return gpu::VulkanImage::CreateFromGpuMemoryBufferHandle( + device_queue, std::move(gmb_handle), size, vk_format, kUsage, /*flags=*/0, + tiling, VK_QUEUE_FAMILY_EXTERNAL); +} + +} // namespace ui
diff --git a/ui/ozone/platform/headless/vulkan_implementation_headless.h b/ui/ozone/platform/headless/vulkan_implementation_headless.h new file mode 100644 index 0000000..7d4912d --- /dev/null +++ b/ui/ozone/platform/headless/vulkan_implementation_headless.h
@@ -0,0 +1,60 @@ +// Copyright (c) 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_PLATFORM_HEADLESS_VULKAN_IMPLEMENTATION_HEADLESS_H_ +#define UI_OZONE_PLATFORM_HEADLESS_VULKAN_IMPLEMENTATION_HEADLESS_H_ + +#include <memory> +#include <vector> + +#include "gpu/vulkan/vulkan_implementation.h" +#include "gpu/vulkan/vulkan_instance.h" + +namespace ui { + +class VulkanImplementationHeadless : public gpu::VulkanImplementation { + public: + explicit VulkanImplementationHeadless(bool use_swiftshader = false); + + VulkanImplementationHeadless(const VulkanImplementationHeadless&) = delete; + VulkanImplementationHeadless& operator=(const VulkanImplementationHeadless&) = + delete; + + // VulkanImplementation: + bool InitializeVulkanInstance(bool using_surface) override; + gpu::VulkanInstance* GetVulkanInstance() override; + std::unique_ptr<gpu::VulkanSurface> CreateViewSurface( + gfx::AcceleratedWidget window) override; + bool GetPhysicalDevicePresentationSupport( + VkPhysicalDevice device, + const std::vector<VkQueueFamilyProperties>& queue_family_properties, + uint32_t queue_family_index) override; + std::vector<const char*> GetRequiredDeviceExtensions() override; + std::vector<const char*> GetOptionalDeviceExtensions() override; + VkFence CreateVkFenceForGpuFence(VkDevice vk_device) override; + std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence( + VkDevice vk_device, + VkFence vk_fence) override; + VkSemaphore CreateExternalSemaphore(VkDevice vk_device) override; + VkSemaphore ImportSemaphoreHandle(VkDevice vk_device, + gpu::SemaphoreHandle handle) override; + gpu::SemaphoreHandle GetSemaphoreHandle(VkDevice vk_device, + VkSemaphore vk_semaphore) override; + VkExternalMemoryHandleTypeFlagBits GetExternalImageHandleType() override; + bool CanImportGpuMemoryBuffer( + gfx::GpuMemoryBufferType memory_buffer_type) override; + std::unique_ptr<gpu::VulkanImage> CreateImageFromGpuMemoryHandle( + gpu::VulkanDeviceQueue* device_queue, + gfx::GpuMemoryBufferHandle gmb_handle, + gfx::Size size, + VkFormat vk_formae) override; + + private: + bool using_surface_ = true; + gpu::VulkanInstance vulkan_instance_; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_HEADLESS_VULKAN_IMPLEMENTATION_HEADLESS_H_
diff --git a/ui/ozone/platform/headless/vulkan_surface_headless.cc b/ui/ozone/platform/headless/vulkan_surface_headless.cc new file mode 100644 index 0000000..e421a7e --- /dev/null +++ b/ui/ozone/platform/headless/vulkan_surface_headless.cc
@@ -0,0 +1,38 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/ozone/platform/headless/vulkan_surface_headless.h" + +#include "base/logging.h" +#include "gpu/vulkan/vulkan_function_pointers.h" +#include "ui/gfx/native_widget_types.h" + +namespace ui { + +// static +std::unique_ptr<VulkanSurfaceHeadless> VulkanSurfaceHeadless::Create( + VkInstance vk_instance, + gfx::AcceleratedWidget widget) { + VkSurfaceKHR vk_surface; + const VkHeadlessSurfaceCreateInfoEXT surface_create_info = { + .sType = VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT, + .pNext = nullptr, + .flags = 0, + }; + VkResult result = vkCreateHeadlessSurfaceEXT( + vk_instance, &surface_create_info, nullptr, &vk_surface); + if (VK_SUCCESS != result) { + DLOG(ERROR) << "vkCreateHeadlessSurfaceEXT() failed: " << result; + return nullptr; + } + return std::make_unique<VulkanSurfaceHeadless>(vk_instance, vk_surface, + widget); +} + +VulkanSurfaceHeadless::VulkanSurfaceHeadless(VkInstance vk_instance, + VkSurfaceKHR vk_surface, + gfx::AcceleratedWidget widget) + : gpu::VulkanSurface(vk_instance, widget, vk_surface) {} + +} // namespace ui
diff --git a/ui/ozone/platform/headless/vulkan_surface_headless.h b/ui/ozone/platform/headless/vulkan_surface_headless.h new file mode 100644 index 0000000..fb9ded1 --- /dev/null +++ b/ui/ozone/platform/headless/vulkan_surface_headless.h
@@ -0,0 +1,30 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_PLATFORM_HEADLESS_VULKAN_SURFACE_HEADLESS_H_ +#define UI_OZONE_PLATFORM_HEADLESS_VULKAN_SURFACE_HEADLESS_H_ + +#include <vulkan/vulkan.h> +#include <memory> + +#include "gpu/vulkan/vulkan_surface.h" + +namespace ui { + +class VulkanSurfaceHeadless : public gpu::VulkanSurface { + public: + static std::unique_ptr<VulkanSurfaceHeadless> Create( + VkInstance vk_instance, + gfx::AcceleratedWidget widget); + VulkanSurfaceHeadless(VkInstance vk_instance, + VkSurfaceKHR vk_surface, + gfx::AcceleratedWidget widget); + + VulkanSurfaceHeadless(const VulkanSurfaceHeadless&) = delete; + VulkanSurfaceHeadless& operator=(const VulkanSurfaceHeadless&) = delete; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_HEADLESS_VULKAN_SURFACE_HEADLESS_H_
diff --git a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc index 43110b6..8c096e3 100644 --- a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc +++ b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
@@ -6,7 +6,9 @@ #include <sync/sync.h> #include <cmath> +#include <cstdint> #include <memory> +#include <utility> #include "base/bind.h" #include "base/task/post_task.h" @@ -120,12 +122,13 @@ solid_color_buffers_holder_(std::make_unique<SolidColorBufferHolder>()), weak_factory_(this) { buffer_manager_->RegisterSurface(widget_, this); - unsubmitted_frames_.push_back(std::make_unique<PendingFrame>()); + unsubmitted_frames_.push_back( + std::make_unique<PendingFrame>(next_frame_id())); } void GbmSurfacelessWayland::QueueOverlayPlane(OverlayPlane plane, BufferId buffer_id) { - unsubmitted_frames_.back()->planes.emplace(buffer_id, std::move(plane)); + unsubmitted_frames_.back()->planes.emplace_back(buffer_id, std::move(plane)); } bool GbmSurfacelessWayland::ScheduleOverlayPlane( @@ -196,7 +199,8 @@ frame->presentation_callback = std::move(presentation_callback); frame->ScheduleOverlayPlanes(this); - unsubmitted_frames_.push_back(std::make_unique<PendingFrame>()); + unsubmitted_frames_.push_back( + std::make_unique<PendingFrame>(next_frame_id())); // If Wayland server supports linux_explicit_synchronization_protocol, fences // should be shipped with buffers. Otherwise, we will wait for fences. @@ -296,7 +300,8 @@ buffer_manager_->UnregisterSurface(widget_); } -GbmSurfacelessWayland::PendingFrame::PendingFrame() = default; +GbmSurfacelessWayland::PendingFrame::PendingFrame(uint32_t frame_id) + : frame_id(frame_id) {} GbmSurfacelessWayland::PendingFrame::~PendingFrame() = default; @@ -366,14 +371,11 @@ // The current scale factor of the surface, which is used to determine // the size in pixels of resources allocated by the GPU process. overlay_configs.back()->surface_scale_factor = surface_scale_factor_; -#if DCHECK_IS_ON() - if (plane.second.overlay_plane_data.z_order == INT32_MIN) - background_buffer_id_ = plane.first; -#endif plane.second.gpu_fence.reset(); } - buffer_manager_->CommitOverlays(widget_, std::move(overlay_configs)); + buffer_manager_->CommitOverlays(widget_, submitted_frame->frame_id, + std::move(overlay_configs)); submitted_frames_.push_back(std::move(submitted_frame)); } } @@ -395,12 +397,15 @@ no_gl_flush_for_tests_ = true; } -void GbmSurfacelessWayland::OnSubmission(BufferId buffer_id, +void GbmSurfacelessWayland::OnSubmission(uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) { - DCHECK(!submitted_frames_.empty()); - DCHECK(submitted_frames_.front()->planes.count(buffer_id) || - buffer_id == background_buffer_id_); + // If the frame_id is stale, the gpu process just recovered from a crash so + // this frame_id can be ignored. + if (submitted_frames_.empty() || + submitted_frames_.front()->frame_id != frame_id) { + return; + } auto submitted_frame = std::move(submitted_frames_.front()); submitted_frames_.erase(submitted_frames_.begin()); @@ -414,7 +419,6 @@ std::move(submitted_frame->completion_callback) .Run(gfx::SwapCompletionResult(swap_result, std::move(release_fence))); - submitted_frame->pending_presentation_buffer = buffer_id; pending_presentation_frames_.push_back(std::move(submitted_frame)); if (swap_result != gfx::SwapResult::SWAP_ACK) { @@ -426,11 +430,12 @@ } void GbmSurfacelessWayland::OnPresentation( - BufferId buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback) { - DCHECK(!pending_presentation_frames_.empty()); - DCHECK_EQ(pending_presentation_frames_.front()->pending_presentation_buffer, - buffer_id); + if (pending_presentation_frames_.empty() || + pending_presentation_frames_.front()->frame_id != frame_id) { + return; + } std::move(pending_presentation_frames_.front()->presentation_callback) .Run(feedback);
diff --git a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h index 9bf10dc..11ab0e5 100644 --- a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h +++ b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
@@ -5,10 +5,9 @@ #ifndef UI_OZONE_PLATFORM_WAYLAND_GPU_GBM_SURFACELESS_WAYLAND_H_ #define UI_OZONE_PLATFORM_WAYLAND_GPU_GBM_SURFACELESS_WAYLAND_H_ -#include <map> #include <memory> +#include <vector> -#include "base/containers/small_map.h" #include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" #include "ui/gfx/native_widget_types.h" @@ -119,10 +118,10 @@ ~GbmSurfacelessWayland() override; // WaylandSurfaceGpu overrides: - void OnSubmission(BufferId buffer_id, + void OnSubmission(uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) override; - void OnPresentation(BufferId buffer_id, + void OnPresentation(uint32_t frame_id, const gfx::PresentationFeedback& feedback) override; // PendingFrame here is a post-SkiaRenderer struct that contains overlays + @@ -130,13 +129,16 @@ // level. This information gets into browser process and overlays are // translated to be attached to WaylandSurfaces of the AcceleratedWidget. struct PendingFrame { - PendingFrame(); + explicit PendingFrame(uint32_t frame_id); ~PendingFrame(); // Queues overlay configs to |planes|. void ScheduleOverlayPlanes(GbmSurfacelessWayland* surfaceless); void Flush(); + // Unique identifier of the frame within this AcceleratedWidget. + uint32_t frame_id; + bool ready = false; // TODO(fangzhoug): This should be changed to support Vulkan. @@ -148,10 +150,9 @@ // fences for a particular OnSubmission. bool schedule_planes_succeeded = false; - // Maps |buffer_id| to one or more OverlayPlanes, used for committing - // overlays and wait for OnSubmission's. - std::multimap<BufferId, OverlayPlane> planes; - BufferId pending_presentation_buffer; + // Contains |buffer_id|s to OverlayPlanes, used for committing overlays and + // wait for OnSubmission's. + std::vector<std::pair<BufferId, OverlayPlane>> planes; }; void MaybeSubmitFrames(); @@ -164,12 +165,6 @@ WaylandBufferManagerGpu* const buffer_manager_; - // |background_buffer_id| is sent to WaylandBufferManagerHost once per - // background_buffer allocation. However WaylandBufferManagerHost may commit - // this buffer more often b/c buffers needs to be re-attached when wl_surface - // is reshown. - BufferId background_buffer_id_; - // The native surface. Deleting this is allowed to free the EGLNativeWindow. gfx::AcceleratedWidget widget_;
diff --git a/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc b/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc index 273df35..9e95538 100644 --- a/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc +++ b/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
@@ -117,7 +117,8 @@ ReadPixels(next_buffer->shm_mapping_.memory()); const auto bounds = gfx::Rect(GetSize()); - buffer_manager_->CommitBuffer(widget_, next_buffer->buffer_id_, bounds, + buffer_manager_->CommitBuffer(widget_, next_buffer->buffer_id_, + /*frame_id*/ next_buffer->buffer_id_, bounds, surface_scale_factor_, bounds); } @@ -132,7 +133,7 @@ } void GLSurfaceEglReadbackWayland::OnSubmission( - uint32_t buffer_id, + uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) { DCHECK(release_fence.is_null()); @@ -142,7 +143,7 @@ if (displayed_buffer_) available_buffers_.push_back(std::move(displayed_buffer_)); displayed_buffer_ = std::move(in_flight_pixel_buffers_.front()); - DCHECK_EQ(displayed_buffer_->buffer_id_, buffer_id); + DCHECK_EQ(displayed_buffer_->buffer_id_, frame_id); } in_flight_pixel_buffers_.pop_front(); @@ -154,7 +155,7 @@ } void GLSurfaceEglReadbackWayland::OnPresentation( - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback) { DCHECK(!presentation_callbacks_.empty()); std::move(presentation_callbacks_.front()).Run(feedback);
diff --git a/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h b/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h index af65f174..8d8f9153 100644 --- a/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h +++ b/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h
@@ -71,10 +71,10 @@ ~GLSurfaceEglReadbackWayland() override; // WaylandSurfaceGpu: - void OnSubmission(uint32_t buffer_id, + void OnSubmission(uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) override; - void OnPresentation(uint32_t buffer_id, + void OnPresentation(uint32_t frame_id, const gfx::PresentationFeedback& feedback) override; void DestroyBuffers();
diff --git a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc index 34912fa8..32ceabf3 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc +++ b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
@@ -259,6 +259,7 @@ } void WaylandBufferManagerGpu::CommitBuffer(gfx::AcceleratedWidget widget, + uint32_t frame_id, uint32_t buffer_id, const gfx::Rect& bounds_rect, float surface_scale_factor, @@ -273,25 +274,26 @@ 1.0f /*opacity*/, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - CommitOverlays(widget, std::move(overlay_configs)); + CommitOverlays(widget, frame_id, std::move(overlay_configs)); } void WaylandBufferManagerGpu::CommitOverlays( gfx::AcceleratedWidget widget, + uint32_t frame_id, std::vector<ozone::mojom::WaylandOverlayConfigPtr> overlays) { DCHECK(gpu_thread_runner_); if (!gpu_thread_runner_->BelongsToCurrentThread()) { // Do the mojo call on the GpuMainThread. gpu_thread_runner_->PostTask( - FROM_HERE, - base::BindOnce(&WaylandBufferManagerGpu::CommitOverlays, - base::Unretained(this), widget, std::move(overlays))); + FROM_HERE, base::BindOnce(&WaylandBufferManagerGpu::CommitOverlays, + base::Unretained(this), widget, frame_id, + std::move(overlays))); return; } - base::OnceClosure task = - base::BindOnce(&WaylandBufferManagerGpu::CommitOverlaysTask, - base::Unretained(this), widget, std::move(overlays)); + base::OnceClosure task = base::BindOnce( + &WaylandBufferManagerGpu::CommitOverlaysTask, base::Unretained(this), + widget, frame_id, std::move(overlays)); RunOrQueueTask(std::move(task)); } @@ -397,26 +399,26 @@ void WaylandBufferManagerGpu::SubmitSwapResultOnOriginThread( gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, gfx::SwapResult swap_result, gfx::GpuFenceHandle release_fence) { DCHECK_NE(widget, gfx::kNullAcceleratedWidget); auto* surface = GetSurface(widget); // The surface might be destroyed by the time the swap result is provided. if (surface) - surface->OnSubmission(buffer_id, swap_result, std::move(release_fence)); + surface->OnSubmission(frame_id, swap_result, std::move(release_fence)); } void WaylandBufferManagerGpu::SubmitPresentationOnOriginThread( gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback) { DCHECK_NE(widget, gfx::kNullAcceleratedWidget); auto* surface = GetSurface(widget); // The surface might be destroyed by the time the presentation feedback is // provided. if (surface) - surface->OnPresentation(buffer_id, feedback); + surface->OnPresentation(frame_id, feedback); } #if defined(WAYLAND_GBM) @@ -507,11 +509,12 @@ void WaylandBufferManagerGpu::CommitOverlaysTask( gfx::AcceleratedWidget widget, + uint32_t frame_id, std::vector<ozone::mojom::WaylandOverlayConfigPtr> overlays) { DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_); DCHECK(remote_host_); - remote_host_->CommitOverlays(widget, std::move(overlays)); + remote_host_->CommitOverlays(widget, frame_id, std::move(overlays)); } void WaylandBufferManagerGpu::DestroyBufferTask(uint32_t buffer_id) {
diff --git a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h index c9115f5..dd27b2bb 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h +++ b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h
@@ -5,6 +5,7 @@ #ifndef UI_OZONE_PLATFORM_WAYLAND_GPU_WAYLAND_BUFFER_MANAGER_GPU_H_ #define UI_OZONE_PLATFORM_WAYLAND_GPU_WAYLAND_BUFFER_MANAGER_GPU_H_ +#include <cstdint> #include <map> #include <memory> @@ -63,13 +64,13 @@ // These two calls get the surface, which backs the |widget| and notifies it // about the submission and the presentation. After the surface receives the - // OnSubmission call, it can schedule a new buffer for swap. + // OnSubmission call, it can schedule a new frame for swap. void OnSubmission(gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, gfx::SwapResult swap_result, gfx::GpuFenceHandle release_fence_handle) override; void OnPresentation(gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback) override; // If the client, which uses this manager and implements WaylandSurfaceGpu, @@ -122,6 +123,7 @@ // CommitBuffer() calls CommitOverlays() to commit only a primary plane // buffer. void CommitBuffer(gfx::AcceleratedWidget widget, + uint32_t frame_id, uint32_t buffer_id, const gfx::Rect& bounds_rect, float surface_scale_factor, @@ -130,6 +132,7 @@ // |widget|. void CommitOverlays( gfx::AcceleratedWidget widget, + uint32_t frame_id, std::vector<ozone::mojom::WaylandOverlayConfigPtr> overlays); // Asks Wayland to destroy a wl_buffer. @@ -182,12 +185,12 @@ // Provides the WaylandSurfaceGpu, which backs the |widget|, with swap and // presentation results. void SubmitSwapResultOnOriginThread(gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, gfx::SwapResult swap_result, gfx::GpuFenceHandle release_fence); void SubmitPresentationOnOriginThread( gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback); void OnHostDisconnected(); @@ -217,6 +220,7 @@ uint32_t buf_id); void CommitOverlaysTask( gfx::AcceleratedWidget widget, + uint32_t frame_id, std::vector<ozone::mojom::WaylandOverlayConfigPtr> overlays); void DestroyBufferTask(uint32_t buffer_id);
diff --git a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc index e5610e60..a58e342 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc +++ b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
@@ -95,8 +95,8 @@ } void CommitBuffer(const gfx::Rect& damage, float buffer_scale) { - buffer_manager_->CommitBuffer(widget_, buffer_id_, gfx::Rect(size_), - buffer_scale, damage); + buffer_manager_->CommitBuffer(widget_, buffer_id_, /*frame_id*/ buffer_id_, + gfx::Rect(size_), buffer_scale, damage); } void OnUse() { @@ -313,7 +313,7 @@ current_buffer_->CommitBuffer(damage, viewport_scale_); } -void WaylandCanvasSurface::OnSubmission(uint32_t buffer_id, +void WaylandCanvasSurface::OnSubmission(uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) { DCHECK(release_fence.is_null()); @@ -323,15 +323,15 @@ // it must be |current_buffer_| because we only submit new buffers when // |current_buffer_| is nullptr, and it is only set to nullptr in // |OnSubmission| and |ResizeCanvas|. In |ResizeCanvas|, |buffers_| is cleared - // so we will not know about |buffer_id|. + // so we will not know about |frame_id|. if (std::none_of(buffers_.begin(), buffers_.end(), - [buffer_id](const auto& buffer) { - return buffer->buffer_id() == buffer_id; + [frame_id](const auto& buffer) { + return buffer->buffer_id() == frame_id; })) return; DCHECK(current_buffer_); - DCHECK_EQ(current_buffer_->buffer_id(), buffer_id); + DCHECK_EQ(current_buffer_->buffer_id(), frame_id); if (previous_buffer_) previous_buffer_->OnRelease(); @@ -344,7 +344,7 @@ } void WaylandCanvasSurface::OnPresentation( - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback) { last_timestamp_ = feedback.timestamp; last_interval_ = feedback.interval;
diff --git a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h index a7f60c1..d417a43 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h +++ b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h
@@ -73,10 +73,10 @@ void ProcessUnsubmittedBuffers(); // WaylandSurfaceGpu overrides: - void OnSubmission(uint32_t buffer_id, + void OnSubmission(uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) override; - void OnPresentation(uint32_t buffer_id, + void OnPresentation(uint32_t frame_id, const gfx::PresentationFeedback& feedback) override; sk_sp<SkSurface> GetNextSurface();
diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h b/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h index 64f3aba5..e6b755c8 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h +++ b/ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h
@@ -20,22 +20,28 @@ // the buffer. class WaylandSurfaceGpu { public: - virtual ~WaylandSurfaceGpu() {} + virtual ~WaylandSurfaceGpu() = default; - // Tells the surface the result of the last swap of buffer with the - // |buffer_id|. After this callback, the previously (before |buffer_id|) - // submitted buffer may be reused. This is guaranteed to be called - // in the same order that buffers were submitted. - virtual void OnSubmission(uint32_t buffer_id, + // Tells the surface the result of the last swap of frame with the |frame_id|. + // After this callback, the previously (before |frame_id|) submitted buffers + // may be reused. This is guaranteed to be called in the same order that + // frames were submitted. If not, there's been a GPU process crash and the + // stale |frame_id| can be ignored. + virtual void OnSubmission(uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) = 0; // Tells the surface the result of the last presentation of buffer with the - // |buffer_id|. This is guaranteed to be called in the same order that - // buffers were submitted, and is guaranteed to be called after the - // corresponding call to |OnSubmission| for this buffer. - virtual void OnPresentation(uint32_t buffer_id, + // |frame_id|. This is guaranteed to be called in the same order that frames + // were submitted, and is guaranteed to be called after the corresponding call + // to |OnSubmission| for this frame. + virtual void OnPresentation(uint32_t frame_id, const gfx::PresentationFeedback& feedback) = 0; + + uint32_t next_frame_id() { return ++frame_id_; } + + private: + uint32_t frame_id_ = 0u; }; } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc index fbb23a2..3e3dea9 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
@@ -256,6 +256,7 @@ void WaylandBufferManagerHost::CommitOverlays( gfx::AcceleratedWidget widget, + uint32_t frame_id, std::vector<ui::ozone::mojom::WaylandOverlayConfigPtr> overlays) { DCHECK(base::CurrentUIThread::IsSet()); @@ -282,7 +283,7 @@ } } - window->CommitOverlays(overlays); + window->CommitOverlays(frame_id, overlays); } void WaylandBufferManagerHost::DestroyBuffer(uint32_t buffer_id) { @@ -425,24 +426,24 @@ } void WaylandBufferManagerHost::OnSubmission(gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence) { DCHECK(base::CurrentUIThread::IsSet()); DCHECK(buffer_manager_gpu_associated_); - buffer_manager_gpu_associated_->OnSubmission(widget, buffer_id, swap_result, + buffer_manager_gpu_associated_->OnSubmission(widget, frame_id, swap_result, std::move(release_fence)); } void WaylandBufferManagerHost::OnPresentation( gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback) { DCHECK(base::CurrentUIThread::IsSet()); DCHECK(buffer_manager_gpu_associated_); - buffer_manager_gpu_associated_->OnPresentation(widget, buffer_id, feedback); + buffer_manager_gpu_associated_->OnPresentation(widget, frame_id, feedback); } void WaylandBufferManagerHost::TerminateGpuProcess() {
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h index e15eea2..3e2e079 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h +++ b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
@@ -109,6 +109,7 @@ // and OnPresentation on successful swap and pixels presented. void CommitOverlays( gfx::AcceleratedWidget widget, + uint32_t frame_id, std::vector<ui::ozone::mojom::WaylandOverlayConfigPtr> overlays) override; // Ensures a WaylandBufferHandle of |buffer_id| is created for the @@ -124,11 +125,11 @@ // Tells the |buffer_manager_gpu_ptr_| the result of a swap call and provides // it with the presentation feedback. void OnSubmission(gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::SwapResult& swap_result, gfx::GpuFenceHandle release_fence); void OnPresentation(gfx::AcceleratedWidget widget, - uint32_t buffer_id, + uint32_t frame_id, const gfx::PresentationFeedback& feedback); private:
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc index e5ecb15..ea2c1ac 100644 --- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -41,18 +41,30 @@ } // namespace WaylandFrame::WaylandFrame( + uint32_t frame_id, WaylandSurface* root_surface, ui::ozone::mojom::WaylandOverlayConfigPtr root_config, base::circular_deque<std::pair<WaylandSubsurface*, ui::ozone::mojom::WaylandOverlayConfigPtr>> - subsurfaces_to_overlays, - bool expects_ack) + subsurfaces_to_overlays) + : frame_id(frame_id), + root_surface(root_surface), + root_config(std::move(root_config)), + subsurfaces_to_overlays(std::move(subsurfaces_to_overlays)), + submission_acked(false), + presentation_acked(false) {} + +WaylandFrame::WaylandFrame( + WaylandSurface* root_surface, + ui::ozone::mojom::WaylandOverlayConfigPtr root_config, + base::circular_deque<std::pair<WaylandSubsurface*, + ui::ozone::mojom::WaylandOverlayConfigPtr>> + subsurfaces_to_overlays) : root_surface(root_surface), root_config(std::move(root_config)), subsurfaces_to_overlays(std::move(subsurfaces_to_overlays)), - buffer_id(this->root_config ? this->root_config->buffer_id : 0), - submission_acked(!expects_ack), - presentation_acked(!expects_ack) {} + submission_acked(true), + presentation_acked(true) {} WaylandFrame::~WaylandFrame() = default; @@ -107,7 +119,6 @@ subsurface_to_overlay.second->buffer_id); // Buffer is gone while this frame is pending, remove this config. if (!handle) { - frame->buffer_id = subsurface_to_overlay.second->buffer_id; frame->buffer_lost = true; subsurface_to_overlay.second.reset(); } else if (!handle->wl_buffer() && !handle_pending_creation) { @@ -121,7 +132,6 @@ auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle( frame->root_surface, frame->root_config->buffer_id); if (!handle) { - frame->buffer_id = frame->root_config->buffer_id; frame->buffer_lost = true; frame->root_config.reset(); } else if (!handle->wl_buffer() && !handle_pending_creation) { @@ -285,7 +295,6 @@ // new wl_buffer, which leads to graphics freeze. So only setup // frame_callback when we're attaching a different buffer. if (!frame->wl_frame_callback) { - frame->buffer_id = config->buffer_id; frame->wl_frame_callback.reset(wl_surface_frame(surface->surface())); wl_callback_add_listener(frame->wl_frame_callback.get(), &frame_listener, this); @@ -540,8 +549,7 @@ continue; frame->presentation_acked = true; connection_->buffer_manager_host()->OnPresentation( - window_->GetWidget(), /*buffer_id*/ frame->buffer_id, - frame->feedback.value()); + window_->GetWidget(), frame->frame_id, frame->feedback.value()); } // Clear frames that are fully released and has already called @@ -570,8 +578,8 @@ // release because SwapCompletionCallback indicates to the client that the // buffers in previous frame is available for reuse. connection_->buffer_manager_host()->OnSubmission( - window_->GetWidget(), /*buffer_id*/ frame->buffer_id, - gfx::SwapResult::SWAP_ACK, std::move(release_fence_handle)); + window_->GetWidget(), frame->frame_id, gfx::SwapResult::SWAP_ACK, + std::move(release_fence_handle)); // If presentation feedback is not supported, use a fake feedback. This // literally means there are no presentation feedback callbacks created.
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.h b/ui/ozone/platform/wayland/host/wayland_frame_manager.h index 2ccc252..51953760 100644 --- a/ui/ozone/platform/wayland/host/wayland_frame_manager.h +++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
@@ -32,13 +32,23 @@ // presented and released. struct WaylandFrame { public: + // A frame originated from gpu process, and hence, requires acknowledgements. + WaylandFrame( + uint32_t frame_id, + WaylandSurface* root_surface, + ui::ozone::mojom::WaylandOverlayConfigPtr root_config, + base::circular_deque<std::pair<WaylandSubsurface*, + ui::ozone::mojom::WaylandOverlayConfigPtr>> + subsurfaces_to_overlays = {}); + + // A frame that does not require acknowledgements. WaylandFrame( WaylandSurface* root_surface, ui::ozone::mojom::WaylandOverlayConfigPtr root_config, base::circular_deque<std::pair<WaylandSubsurface*, ui::ozone::mojom::WaylandOverlayConfigPtr>> - subsurfaces_to_overlays = {}, - bool expects_ack = true); + subsurfaces_to_overlays = {}); + WaylandFrame() = delete; WaylandFrame(const WaylandFrame&) = delete; WaylandFrame& operator=(const WaylandFrame&) = delete; @@ -47,6 +57,7 @@ private: friend class WaylandFrameManager; + uint32_t frame_id; WaylandSurface* root_surface; ui::ozone::mojom::WaylandOverlayConfigPtr root_config; base::circular_deque< @@ -55,11 +66,6 @@ base::flat_map<WaylandSurface*, WaylandBufferHandle*> submitted_buffers; - // ID of one of the buffers that will be attached to the subsurfaces. If none - // of the buffers will be attached, this is |root_config->buffer_id|. - // Used to invoke buffer_manager_host OnSubmission and OnPrensentation calls. - uint32_t buffer_id; - // An indicator that there are buffers destrotyed before frame playback. This // frame should be skipped. bool buffer_lost = false; @@ -73,7 +79,7 @@ // for this frame. base::ScopedFD merged_release_fence_fd; // Whether this frame has had OnSubmission sent for it. - bool submission_acked = false; + bool submission_acked; // The wayland object identifying this feedback. wl::Object<struct wp_presentation_feedback> pending_feedback; @@ -81,7 +87,7 @@ // Wayland server has not arrived yet. absl::optional<gfx::PresentationFeedback> feedback = absl::nullopt; // Whether this frame has had OnPresentation sent for it. - bool presentation_acked = false; + bool presentation_acked; }; // This is the frame update manager that configures graphical window/surface
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 8395f8e..9ab5eeb 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -252,8 +252,7 @@ subsurfaces_to_overlays.emplace_back(subsurface.get(), nullptr); frame_manager_->RecordFrame(std::make_unique<WaylandFrame>( - root_surface(), nullptr, std::move(subsurfaces_to_overlays), - /*expects_ack=*/false)); + root_surface(), nullptr, std::move(subsurfaces_to_overlays))); } void WaylandWindow::Close() { @@ -767,6 +766,7 @@ } bool WaylandWindow::CommitOverlays( + uint32_t frame_id, std::vector<ui::ozone::mojom::WaylandOverlayConfigPtr>& overlays) { if (overlays.empty()) return true; @@ -804,7 +804,7 @@ if (!wayland_overlay_delegation_enabled_) { DCHECK_EQ(overlays.size(), 1u); frame_manager_->RecordFrame(std::make_unique<WaylandFrame>( - root_surface(), std::move(*main_overlay))); + frame_id, root_surface(), std::move(*main_overlay))); return true; } @@ -869,9 +869,9 @@ root_config->surface_scale_factor = buffer_scale; root_config->rounded_clip_bounds = rounded_clip_bounds; - frame_manager_->RecordFrame( - std::make_unique<WaylandFrame>(root_surface(), std::move(root_config), - std::move(subsurfaces_to_overlays))); + frame_manager_->RecordFrame(std::make_unique<WaylandFrame>( + frame_id, root_surface(), std::move(root_config), + std::move(subsurfaces_to_overlays))); return true; }
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 43964224..d91ff373 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -93,6 +93,7 @@ // subsurface_stack_below_.size() >= below. bool ArrangeSubsurfaceStack(size_t above, size_t below); bool CommitOverlays( + uint32_t frame_id, std::vector<ui::ozone::mojom::WaylandOverlayConfigPtr>& overlays); // Set whether this window has pointer focus and should dispatch mouse events.
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc index e8d7cda..7ef5bff 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -2661,7 +2661,8 @@ background->surface_scale_factor = 1; background->opacity = 1.f; overlays.push_back(std::move(background)); - buffer_manager_gpu_->CommitOverlays(window->GetWidget(), std::move(overlays)); + buffer_manager_gpu_->CommitOverlays(window->GetWidget(), 1u, + std::move(overlays)); mock_surface->SendFrameCallback(); Sync(); @@ -2693,7 +2694,8 @@ primary->surface_scale_factor = 1; primary->opacity = 1.f; overlays.push_back(std::move(primary)); - buffer_manager_gpu_->CommitOverlays(window->GetWidget(), std::move(overlays)); + buffer_manager_gpu_->CommitOverlays(window->GetWidget(), 2u, + std::move(overlays)); Sync();
diff --git a/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom b/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom index 559efeef..73f211f1 100644 --- a/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom +++ b/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom
@@ -80,8 +80,9 @@ DestroyBuffer(uint32 buffer_id); // Send overlay configurations for a frame to a WaylandWindow with the - // following |widget|. + // following |widget| and |frame_id|. CommitOverlays(gfx.mojom.AcceleratedWidget widget, + uint32 frame_id, array<WaylandOverlayConfig> overlays); }; @@ -120,12 +121,12 @@ // Signals about swap completion. OnSubmission(gfx.mojom.AcceleratedWidget widget, - uint32 buffer_id, + uint32 frame_id, gfx.mojom.SwapResult swap_result, gfx.mojom.GpuFenceHandle? release_fence_handle); // Signals about presentation. OnPresentation(gfx.mojom.AcceleratedWidget widget, - uint32 buffer_id, + uint32 frame_id, gfx.mojom.PresentationFeedback feedback); };
diff --git a/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc b/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc index 0a0aa914..ef4c9720 100644 --- a/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc +++ b/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
@@ -373,8 +373,9 @@ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, window_->GetBounds(), - kDefaultScale, window_->GetBounds()); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, + window_->GetBounds(), kDefaultScale, + window_->GetBounds()); CreateDmabufBasedBufferAndSetTerminateExpectation(true /*fail*/, kBufferId1); @@ -395,8 +396,9 @@ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, window_->GetBounds(), - kDefaultScale, window_->GetBounds()); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, + window_->GetBounds(), kDefaultScale, + window_->GetBounds()); DestroyBufferAndSetTerminateExpectation(kBufferId1, false /*fail*/); } @@ -416,8 +418,9 @@ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kBufferId1); // Attach to a surface. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, window_->GetBounds(), - kDefaultScale, window_->GetBounds()); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, + window_->GetBounds(), kDefaultScale, + window_->GetBounds()); // Created non-attached buffer as well. CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, @@ -446,7 +449,7 @@ // Can't commit for non-existing buffer id. SetTerminateCallbackExpectationAndDestroyChannel(&callback_, true /*fail*/); - buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), 5u, + buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), 1u, 5u, window_->GetBounds(), kDefaultScale, window_->GetBounds()); @@ -474,7 +477,7 @@ false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), 1u, std::move(overlay_configs)); Sync(); @@ -499,7 +502,7 @@ false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), 1u, std::move(overlay_configs)); Sync(); @@ -509,7 +512,7 @@ // Destroying the buffer causes all wl_buffer objects to be destroyed. DestroyBufferAndSetTerminateExpectation(1u, false /*fail*/); SetTerminateCallbackExpectationAndDestroyChannel(&callback_, true /*fail*/); - buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), 1u, + buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), 1u, 1u, window_->GetBounds(), kDefaultScale, window_->GetBounds()); Sync(); @@ -522,7 +525,7 @@ // Can't commit for non-existing widget. SetTerminateCallbackExpectationAndDestroyChannel(&callback_, true /*fail*/); - buffer_manager_gpu_->CommitBuffer(gfx::kNullAcceleratedWidget, kBufferId, + buffer_manager_gpu_->CommitBuffer(gfx::kNullAcceleratedWidget, 1u, kBufferId, window_->GetBounds(), kDefaultScale, window_->GetBounds()); @@ -554,7 +557,7 @@ bounds_rect, gfx::RectF(), window_->GetBounds(), false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), 1u, std::move(overlay_configs)); Sync(); @@ -602,8 +605,8 @@ ASSERT_TRUE(!connection_->presentation()); EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -614,8 +617,8 @@ Sync(); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); Sync(); @@ -644,8 +647,8 @@ .Times(1); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -722,8 +725,8 @@ EXPECT_CALL(mock_surface_gpu, OnSubmission(kBufferId1, gfx::SwapResult::SWAP_ACK, _)) .Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -732,8 +735,8 @@ mock_wp_presentation->set_presentation_callback(nullptr); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -754,8 +757,8 @@ // Commit buffer 3 then send the presentation callback for it. This should // not call OnPresentation as OnSubmission hasn't been called yet. EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); mock_wp_presentation->SendPresentationCallback(); Sync(); @@ -837,8 +840,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); // Commit first buffer - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -856,8 +859,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); // Commit second buffer - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); Sync(); @@ -877,8 +880,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); // Commit third buffer - buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds, + kDefaultScale, bounds); Sync(); @@ -962,7 +965,7 @@ EXPECT_CALL(*mock_surface, Frame(_)).Times(0); EXPECT_CALL(*mock_surface, Commit()).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, + buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, kDmabufBufferId, window_->GetBounds(), kDefaultScale, window_->GetBounds()); Sync(); @@ -996,7 +999,7 @@ EXPECT_CALL(*mock_surface, Frame(_)).Times(0); EXPECT_CALL(*mock_surface, Commit()).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId2, + buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId2, kDmabufBufferId2, window_->GetBounds(), kDefaultScale, window_->GetBounds()); @@ -1057,7 +1060,7 @@ EXPECT_CALL(*mock_surface, Frame(_)).Times(0); EXPECT_CALL(*mock_surface, Commit()).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, + buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, kDmabufBufferId, window_->GetBounds(), kDefaultScale, window_->GetBounds()); Sync(); @@ -1119,8 +1122,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -1144,8 +1147,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId2, _)).Times(1); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); Sync(); @@ -1169,8 +1172,8 @@ .Times(0); EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId3, _)).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds, + kDefaultScale, bounds); Sync(); @@ -1206,8 +1209,9 @@ Sync(); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId, temp_window->GetBounds(), - kDefaultScale, temp_window->GetBounds()); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId, kBufferId, + temp_window->GetBounds(), kDefaultScale, + temp_window->GetBounds()); Sync(); @@ -1239,8 +1243,8 @@ temp_window.reset(); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId, kBufferId, bounds, + kDefaultScale, bounds); Sync(); @@ -1281,8 +1285,8 @@ EXPECT_CALL(mock_surface_gpu, OnSubmission(_, _, _)).Times(1); EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -1302,8 +1306,8 @@ .Times(1); EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId2, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); Sync(); @@ -1315,8 +1319,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); temp_window.reset(); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -1352,8 +1356,8 @@ .Times(1); EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); testing::Mock::VerifyAndClearExpectations(&mock_surface_gpu); @@ -1362,13 +1366,13 @@ EXPECT_CALL(mock_surface_gpu, OnSubmission(_, _, _)).Times(0); EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -1419,8 +1423,8 @@ .Times(1); EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); testing::Mock::VerifyAndClearExpectations(&mock_surface_gpu); @@ -1430,13 +1434,13 @@ EXPECT_CALL(mock_surface_gpu, OnSubmission(_, _, _)).Times(0); EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -1487,8 +1491,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1); EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); testing::Mock::VerifyAndClearExpectations(&mock_surface_gpu); @@ -1499,14 +1503,14 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(2); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); auto* wl_buffer2 = mock_surface->attached_buffer(); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -1576,8 +1580,8 @@ .Times(1); EXPECT_CALL(*mock_surface, Commit()).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -1599,8 +1603,8 @@ EXPECT_CALL(*mock_surface, Commit()).Times(1); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); Sync(); @@ -1641,8 +1645,8 @@ EXPECT_CALL(*mock_surface, Commit()).Times(1); // Commit second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); Sync(); @@ -1676,8 +1680,8 @@ .Times(1); EXPECT_CALL(*mock_surface, Commit()).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); @@ -1726,8 +1730,8 @@ .Times(1); EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); DestroyBufferAndSetTerminateExpectation(kBufferId1, false /*fail*/); @@ -1783,7 +1787,7 @@ 1, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE, kBufferId3, kDefaultScale, gfx::RectF(bounds), gfx::RectF(), bounds, false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), 1u, std::move(overlay_configs)); Sync(); testing::Mock::VerifyAndClearExpectations(mock_surface); @@ -1841,14 +1845,14 @@ OnSubmission(kBufferId1, gfx::SwapResult::SWAP_ACK, Truly([](const auto& fence) { return fence.is_null(); }))) .Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); // Commit the second buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -1868,8 +1872,8 @@ Sync(); // Commit the third buffer now. - buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds, + kDefaultScale, bounds); mock_surface->SendFrameCallback(); Sync(); @@ -1924,8 +1928,8 @@ .Times(1); EXPECT_CALL(*mock_surface_gpu.get(), OnPresentation(kBufferId1, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); // The root surface shouldn't get null buffer attached. @@ -1976,8 +1980,8 @@ .Times(1); EXPECT_CALL(*mock_surface_gpu.get(), OnPresentation(kBufferId1, _)).Times(1); - buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, bounds, kDefaultScale, - bounds); + buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds, + kDefaultScale, bounds); Sync(); DestroyBufferAndSetTerminateExpectation(kBufferId1, false /*fail*/); @@ -2022,7 +2026,7 @@ 1, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE, kBufferId3, kDefaultScale, gfx::RectF(bounds), gfx::RectF(), bounds, false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), 1u, std::move(overlay_configs)); Sync(); @@ -2084,7 +2088,7 @@ kDefaultScale, gfx::RectF(bounds), gfx::RectF(), bounds, false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), 2u, std::move(overlay_configs2)); Sync(); @@ -2157,6 +2161,7 @@ {gfx::OverlayPriorityHint::kHardwareProtection, OVERLAY_PRIORITIZED_SURFACE_OVERLAY_PRIORITY_REQUIRED_HARDWARE_PROTECTION}}; + uint32_t frame_id = 0u; for (const auto& priority : priorities) { std::vector<ui::ozone::mojom::WaylandOverlayConfigPtr> overlay_configs; for (auto id : kBufferIds) { @@ -2167,7 +2172,7 @@ false, 1.0f, gfx::GpuFenceHandle(), priority.first, gfx::RRectF())); } - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), ++frame_id, std::move(overlay_configs)); Sync(); @@ -2233,6 +2238,7 @@ // Exo may allow to submit values in px. std::vector<bool> in_pixels = {true, false}; + uint32_t frame_id = 0u; for (auto is_in_px : in_pixels) { connection_->set_surface_submission_in_pixel_coordinates(is_in_px); for (auto scale_factor : scale_factors) { @@ -2247,7 +2253,7 @@ gfx::OverlayPriorityHint::kNone, rounded_corners)); } - buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), + buffer_manager_gpu_->CommitOverlays(window_->GetWidget(), ++frame_id, std::move(overlay_configs)); Sync(); @@ -2354,7 +2360,8 @@ EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0); } - buffer_manager_gpu_->CommitBuffer(widget, next_buffer_id_commit, bounds, + buffer_manager_gpu_->CommitBuffer(widget, next_buffer_id_commit, + next_buffer_id_commit, bounds, kDefaultScale, bounds); Sync(); @@ -2388,8 +2395,8 @@ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/, kDmabufBufferId); buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), kDmabufBufferId, - window_->GetBounds(), kDefaultScale, - window_->GetBounds()); + kDmabufBufferId, window_->GetBounds(), + kDefaultScale, window_->GetBounds()); DestroyBufferAndSetTerminateExpectation(kDmabufBufferId, false /*fail*/); base::RunLoop().RunUntilIdle(); @@ -2464,7 +2471,7 @@ bounds_rect, gfx::RectF(), temp_window->GetBounds(), false, 1.0f, gfx::GpuFenceHandle(), gfx::OverlayPriorityHint::kNone, gfx::RRectF())); - buffer_manager_gpu_->CommitOverlays(temp_window->GetWidget(), + buffer_manager_gpu_->CommitOverlays(temp_window->GetWidget(), 1u, std::move(overlay_configs)); Sync();
diff --git a/ui/views/button_drag_utils.cc b/ui/views/button_drag_utils.cc index 7b74093f..05b1f84 100644 --- a/ui/views/button_drag_utils.cc +++ b/ui/views/button_drag_utils.cc
@@ -107,8 +107,12 @@ } gfx::Size size(button->GetPreferredSize()); - button->SetBoundsRect(gfx::Rect(size)); + // drag_widget's size must be set to show the drag image in RTL. + // However, on Windows, calling Widget::SetSize() resets + // the LabelButton's bounds via OnNativeWidgetSizeChanged(). + // Therefore, call button->SetBoundsRect() after drag_widget->SetSize(). drag_widget->SetSize(size); + button->SetBoundsRect(gfx::Rect(size)); gfx::Vector2d press_point; if (press_pt)
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn b/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn index 677200e0..9e08e40 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
@@ -108,7 +108,7 @@ js_library("mojo_interface_provider.m") { sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js" ] deps = [ - "//chromeos/services/cellular_setup/public/mojom:mojom_js_library_for_compile", + "//ash/services/cellular_setup/public/mojom:mojom_js_library_for_compile", "//ui/webui/resources/js:cr.m", ] extra_deps = [ ":modulize" ] @@ -201,7 +201,7 @@ ":provisioning_page.m", ":setup_loading_page.m", ":subflow_behavior.m", - "//chromeos/services/cellular_setup/public/mojom:mojom_js_library_for_compile", + "//ash/services/cellular_setup/public/mojom:mojom_js_library_for_compile", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/js:assert.m", "//ui/webui/resources/js:i18n_behavior.m",
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html index b465a3a..c17a04c 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html
@@ -2,6 +2,6 @@ <link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html"> <link rel="import" href="chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom.html"> <link rel="import" href="chrome://resources/mojo/mojo/public/mojom/base/string16.mojom.html"> -<link rel="import" href="chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.html"> -<link rel="import" href="chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.html"> +<link rel="import" href="chrome://resources/mojo/ash/services/cellular_setup/public/mojom/cellular_setup.mojom.html"> +<link rel="import" href="chrome://resources/mojo/ash/services/cellular_setup/public/mojom/esim_manager.mojom.html"> <script src="mojo_interface_provider.js"></script>
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js index 5b79070..1578c4b 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
@@ -7,8 +7,8 @@ // #import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js'; // #import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js'; // #import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js'; -// #import 'chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js'; -// #import 'chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js'; +// #import 'chrome://resources/mojo/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js'; +// #import 'chrome://resources/mojo/ash/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js'; // clang-format on cr.define('cellular_setup', function() {
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js b/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js index 88fc001..b4e3d9b 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js +++ b/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js
@@ -42,6 +42,9 @@ onVpnProvidersChanged() {}, onNetworkCertificatesChanged() {}, + + /** @param {string} userhash */ + onPoliciesApplied(userhash) {}, }; /** @interface */ @@ -69,4 +72,7 @@ onVpnProvidersChanged() {} onNetworkCertificatesChanged() {} + + /** @param {!string} userhash */ + onPoliciesApplied(userhash) {} }